一开始错误的尝试:
class Solution {
public:
void moveZeroes(std::vector<int>& nums) {
int length = nums.size();
for (int i = 0; i < length; i++ ) {
for (int j = i + 1; j < length; j++) {
if (nums[j - 1] == 0) {
nums[j - 1] = nums[j];//后面的值覆盖前面的值
nums[j] = 0;
}
}
}
}
};
我的设想是检查当前数,如果值为零,就跟后一个数交换,再把后一个数作为当前数,进行循环,但是这个逻辑当出现两个连续的0时就熄火了,并且代码臃肿。
改进后的正确代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int length = nums.size();
int count=0;
for (int i = 0; i < length; i++ ) {
if(nums[i]!=0){
nums[count]=nums[i];
count++;
}
}
for(int i=count;i<length;i++){
nums[i]=0;
}
}
};
逻辑:把原来的零默认为空置,当遍历到非零元素时,就把它放到第一个(不用担心覆盖了第一个元素,因为要么是空,要么是非零元素本身),遍历一遍后再补齐缺少的零。
官方答案:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int fast = 0, slow = 0;
while(fast < nums.size()){
if(nums[fast] != 0){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
while(slow < nums.size()){
nums[slow] = 0;
slow++;
}
}
};