初级算法:移动零

移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

我的思路:遍历数组 为零的话直接擦除,然后在末尾压入0。运行不成功,问题出在不理解erase的用法,不理解擦除后迭代器指向的是哪一个。
根据其他大神题解修改而来的暴力方法:
需要学习的是:1.迭代器自加可以放在块语句中,在不满足条件时自加。而erase函数使用迭代器,并且直接返回下一个迭代器的位置,相当于隐式的实现了迭代器向后移位。
2清除元素后,不要直接尾插入零,尽量一步完成一个动作。(插入会使迭代器失效?)

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int cnt=0;
        for(auto it=nums.begin();it<nums.end(); ){
            if(*it==0){
                it=nums.erase(it);
                cnt+=1;
            }
            else{
                ++it;
            }
        }
        while(cnt--){
            nums.push_back(0);
        }
    }
};

题解1:最简单应该想到的思路;分步进行,借助另一个数组。先统计0的个数,然后把非零压入新数组ans,再末尾加对应数量的0,然后拷贝。题解程序有很多可以学习的地方。比如说 cnt+=(*it0);while(cnt–)
代码:class Solution {
public:
void moveZeroes(vector& nums) {
int cnt=0;
vectorans;
for(auto it=nums.begin();it<nums.end();++it){
cnt+=(*it
0);
}
for(auto it1=nums.begin();it1<nums.end();++it1){
if(*it1!=0){
ans.push_back(*it1);
}else continue;
}
while(cnt–){
ans.push_back(0);
}
for(auto it2=0;it2<nums.size();it2++){
nums[it2]=ans[it2];
}
}
};

发布了36 篇原创文章 · 获赞 0 · 访问量 624

猜你喜欢

转载自blog.csdn.net/weixin_43199933/article/details/102762222
今日推荐