第一次尝试的报错
void function 'moveZeroes' should not return a value [-Wreturn-type]
因为这个题不需要返回值 void 中文:空的
第二次报错
这是因为vector的索引不能为负
addition of unsigned offset to 0x503000000070 overflowed to 0x50300000006c (stl_vector.h) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/stl_vector.h:1046:34
根据链接
代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int i = 0;i<nums.size();i++){
if(nums[i] == 0){
int m = nums[i];
for(int j = i;j<nums.size();j++){
nums[j] = nums[j+1];
}
nums[-1]=0;
}
}
}
};
最终思路
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size(),left = 0,right = 0;
while(right<n){
if(nums[right]){
swap(nums[left],nums[right]);
left++;
}
right++;
}
}
};
具体思路如下
right为快针,每次循环都会往前走,若发现指到的数为零,两个指针交换,left向右走一步,很妙的算法,真的很难想到