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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

示例 2:

提示:

  • 1 <= nums.length <= 10
  • -2 <= nums[i] <= 2 - 1

进阶:你能尽量减少完成的操作次数吗?

class Solution {
public:
    // 定义一个函数 moveZeroes,它接受一个整数类型的向量 nums 的引用作为参数
    void moveZeroes(vector<int>& nums) {
        // 初始化一个慢指针 slow 用于跟踪最新非零元素应该放置的位置
        int slow = 0;
        
        // 使用快指针 fast 遍历数组中的所有元素
        for (int fast = 0; fast < nums.size(); fast++) {
            // 如果当前的快指针指向的元素不等于 0
            if (nums[fast] != 0) {
                // 将该非零元素赋值给慢指针指向的位置
                nums[slow++] = nums[fast];
            }
            // 慢指针会在每次赋值后自增,这样可以保证下一个非零元素放置在上一个非零元素的后面
        }
        
        // 经过上面的循环后,所有的非零元素都已经按原始顺序移动到数组的前面了
        // 现在 slow 指针指向的位置就是第一个 0 应该被放置的位置
        
        // 从慢指针当前的位置开始,直到数组的结束
        while (slow < nums.size()) {
            // 将剩下的所有位置设置为 0
            nums[slow++] = 0;
        }
        
        // 至此,所有的 0 都被移动到了数组的末尾,同时非零元素的相对顺序保持不变
    }
};
01-27 10:22