为了更好地理解和演示这个问题,接下来结合一个具体的例子展示如何一步步地将所有 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++;
}
}
}
};