跳到主要内容

move-zeroes

283. 移动零

题解

使用两个指针,例如 pa,和 pb,根据不同的状态采用不同的处理即可。

class Solution {
public:
void moveZeroes(vector<int>& nums) {
const int n = nums.size();

int pa = 0;
int pb = 0;
while(pb<n){
if(nums[pa]!=0){
pa++;
pb++;
continue;
}

if(nums[pb]==0){
pb++;
continue;
}

nums[pa] = nums[pb];
nums[pb] = 0;
pa++;
pb++;
}
}
};

官方的题解更简洁:

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++;
}
}
};

如果数组没有 0,那么快慢指针始终指向同一个位置,每个位置自己和自己交换;如果数组有 0,快指针先走一步,此时慢指针对应的就是 0,所以要交换。