给定一个数组 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 都被移动到了数组的末尾,同时非零元素的相对顺序保持不变
}
};