题目:给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
注意:必须在不复制数组的情况下原地对数组进行操作。
这道题我一来就开始做,没有审题(保持非零元素相对顺序),就造成了下面的错解:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
int right = n - 1;
for (int left = 0; left < n; left++) {
if (nums[left] == 0) {
int temp = 0;
temp = nums[right];
nums[right] = nums[left];
nums[left] = temp;
right--;
n--;
}
}
}
};
这样解出来的顺序就是错误的 ,相反了。
经过审题之后,决定用快慢指针法来做,代码如下:
class Solution {
public:
// 将数组中的所有零移动到末尾
void moveZeroes(vector<int>& nums) {
int n = nums.size(); // 获取数组的大小,即元素个数
int slow = 0; // 慢指针,用于指示当前非零元素应该插入的位置
// 遍历数组
for(int fast = 0; fast < n; fast++) {
// 如果当前元素不为零
if(nums[fast] != 0) {
nums[slow] = nums[fast]; // 将非零元素移到数组的前面
slow++; // 慢指针后移一位
}
}
// 将剩余的位置填充零
for(; slow < n; slow++) {
nums[slow] = 0;
}
}
};
谢谢大家,继续努力。