最初想法:利用双指针 若i 指针的位置为0 则交换 i,j将 i 后移
void moveZeroes(vector<int>& nums) {
for (int i = 0, j = 1; i < nums.size(); i++) {
int mid = 0;
if (nums[i] == 0) {
mid = nums[j];
nums[j] = nums[i];
nums[i] = mid;
j++;
}
}
}
问题所在:在每次交换时,将零元素与nums[j]进行交换,而j最终值为1。这意味着我们始终将零元素与nums[1]进行交换,而不是仅仅将其移动到堆栈的消耗。
有两个地方的修改:1.将 j 放在for 循环外面避免 每次交换只与nums[0]交换 ,将nums[i]==0 换成nums[i] != 0 这样遇到非零元素 就与 nums[j]交换位置
使用了两个指针修改i和j,其中i用于遍历整个队列,而j则指示下一个非零元素应该放置的位置。
当遇到非零元素时,我们将其与其nums[j]进行交换,放入j后移的部分
修改后的代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int mid;
int j=0;
for(int i=0; i<nums.size(); i++){
if(nums[i]!=0){
mid=nums[j];
nums[j]=nums[i];
nums[i]=mid;
j++;
}
}
}
};
也可以用swap 函数
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j=0;
for(int i=0; i<nums.size(); i++){
if(nums[i]!=0){
swap(nums[i],nums[j]);
j++;
}
}
}
};