给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
分析:
最容易想到当遇到 0,把其后的数全部向前移动一位,也能发现,代价太大
继续考虑,既然要让 0 移动到最后,那我们可以把最后的位置给“腾出来”,
即设置一个常量 j,对非 0 元素计数,如果遇到非 0,该元素覆盖到 nums[j] 的位置,同时 j+1,一轮遍历完成后,再把 nums 中 j 之后的数用 0 覆盖
class Solution {
public void moveZeroes(int[] nums) {
int j = 0;
for (int i : nums) {
if (i != 0)
nums[j++] = i;
}
for (int i = nums.length - 1; i >= j; i--)
nums[i] = 0;
}
}