给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
解法一:快慢指针
定义两个index;快指针quick_index指在需要发生移动的位置,即不等于0的位置;慢指针slow_index指在移动好的位置
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
int quick_index=0,slow_index = 0;
while(quick_index<n){
if(nums[quick_index]!=0){
swap(nums[quick_index],nums[slow_index]);
slow_index++;
}
quick_index++;
}
}
};
解法二:覆盖法
第一次循环:将不等于零的依次重新覆盖到数组中
第二次循环:接替位置,填充0
0 1 0 3 12
》》1 1 0 3 12
》》1 3 0 3 12
》》1 3 12 3 12
第二次循环 index=3
>> 1 3 12 0 12
>> 1 3 12 0 0 完成
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
int index = 0;
for(auto &num:nums){
if(num!=0){
nums[index]=num;
index++;
}
}
for(index;index<n;index++){
nums[index]=0;
}
}
};