题目

力扣题目链接

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

示例:

  1. 输入: [0,1,0,3,12]
  2. 输出: [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/