其实最简单的办法是遍历一遍,记录出现的非零元素个数,每个非零元素放在对应个数的位置上。
cpp
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int sum=0;
for(int i=0;i<nums.size();i++){
if(nums[i]!=0){
nums[sum]=nums[i];
sum++;
}
}
for(sum;sum<nums.size();sum++) nums[sum]=0;
}
};
但还是想用推荐的双指针做:
(参考了答案)原理是一快一慢指针,保证慢指针前面全是非零元素,快指针和慢指针之前全是0元素,每次保证快指针指向非零元素,慢指针指向零元素,交换快慢指针即可。
cpp
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slow=0;
int n=nums.size();
while(slow<n&&nums[slow]!=0) slow++;
int fast=slow;
while(fast<n&&nums[fast]==0) fast++;
while(fast<n){
swap(nums[fast],nums[slow]);
fast++;
slow++;
while(slow<n&&nums[slow]!=0) slow++;
while(fast<n&&nums[fast]==0) fast++;
}
}
};