移动0

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

示例:

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

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

这道题的解法,我最先想到的就是暴力法,就是将所以nums中非0的地址放在一个vector中,然后再对nums重新赋值,最后将0放在后面。
解法一,暴力解:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int len = nums.size();
        vector<int>temp;
        int len2=0;
        for(int i=0;i<len;i++){
            if(nums[i]!=0){
                temp.push_back(i);
                len2++;
            }
        }
        // int len2 = temp.size();
        for(int j=0;j<len2;j++){
            nums[j]=nums[temp[j]];
        }
        for(int k=len2;k<len;k++){
            nums[k]=0;
        }
    }
};

当然这道题是有最优解法的,下面展示我看到最简单的解法:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int i=0,j=0;j<nums.size();j++){
            if(nums[j]!=0){
                swap(nums[i++],nums[j]);
            }
        }
    }
};

这个我想,你一看就懂吧

发布了111 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42738495/article/details/102602178
今日推荐