题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
思路
这道题与 27. 移除元素 非常像,建议做这道题之前先把 27. 移除元素 做了。
本题和 27. 移除元素 其实是一个套路。
相当于对整个数组移除元素 0,然后 slowIndex 之后都是移除元素 0 的冗余元素,把这些元素都赋值为 0 就可以了。
答案
Java
双指针法
class Solution {
public void moveZeroes(int[] nums) {
// 快慢双指针
int slowIndex = 0, fastIndex = 0;
// 让快指针遍历数组
for (; fastIndex < nums.length; fastIndex++) {
// 当前快指针指向的值若不为 0
if (nums[fastIndex] != 0) {
// 将当前快指针指向的值覆盖到慢指针指向的值, 并右移慢指针
nums[slowIndex++] = nums[fastIndex];
}
}
// 补 0
for (int i = slowIndex; i < nums.length; i++) {
nums[i] = 0;
}
}
}
REF
https://leetcode-cn.com/problems/move-zeroes/
https://leetcode-cn.com/problems/move-zeroes/solution/283-yi-dong-ling-shuang-zhi-zhen-xiang-jie-by-ca-2/
