283. 移动零

为了更好地理解和演示这个问题,接下来结合一个具体的例子展示如何一步步地将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。以下是示例 1 的具体过程:

初始状态

nums = [0, 1, 0, 3, 12]

第 1 次循环(i = 0)

  • 因为nums[0]是 0,所以不进行交换。
nums = [0, 1, 0, 3, 12]
left = 0

第 2 次循环(i = 1)

  • nums[1]是 1,不为 0,进行交换,但实际上是自己和自己交换。
nums = [1, 0, 0, 3, 12]
left = 1

第 3 次循环(i = 2)

  • nums[2]是 0,所以不进行交换。
nums = [1, 0, 0, 3, 12]
left = 1

第 4 次循环(i = 3)

  • nums[3]是 3,不为 0,与left位置的元素交换。
nums = [1, 3, 0, 0, 12]
left = 2

第 5 次循环(i = 4)

  • nums[4]是 12,不为 0,与left位置的元素交换。
nums = [1, 3, 12, 0, 0]
left = 3

结果

循环结束后,所有的 0 被移动到了数组的末尾,同时 1、3 和 12 保持了它们原有的顺序。

输出: nums = [1, 3, 12, 0, 0]

这个方法通过使用一个额外的指针left来标记非零元素应该移动到的位置,能够有效地在一次遍历中解决问题。

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int left = 0;
        int size = nums.size();
        for (int i = 0; i < size; i++) {
            if (nums[i] != 0) {
                int t = nums[i];
                nums[i] = nums[left];
                nums[left] = t;
                left++;
            }
        }
    }
};