给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

分析:
最容易想到当遇到 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;
    }
}