给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
1. 删除所有零后在末尾补插入
void moveZeroes(vector<int>& nums) {
int cnt=nums.size();
nums.erase(remove(nums.begin(), nums.end(), 0), nums.end());
for(int i=0;i<cnt-nums.size();i++)
nums.push_back(0);
}
2. 双指针
void moveZeroes(vector<int>& nums) {
int len = nums.size();
int cou_not0 = 0;
for (int i=0; i<len; i++)
{
if (nums[i] != 0)
nums[cou_not0++] = nums[i];
}
for (int i=cou_not0; i<len; i++)
nums[i] = 0;
}
//利用元素交换改进
void moveZeroes(vector<int>& nums) {
int size = nums.size() - 1;
int count= 0;//相当于非零数量
for(int i = 0;i <= size;i++){
if(nums[i] != 0)
swap(nums[i],nums[count++]);
}
}
3. 利用迭代器删除
void moveZeroes(vector<int>& nums) {
int count = 0;
for(auto it=nums.begin(); it!=nums.end(); ){
if(*it == 0){
it = nums.erase(it);
count ++;
}
else{++it;}}
nums.insert(nums.end(), count, 0);
}