283. 移动零 - 力扣(LeetCode)

题目描述

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

示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解1

思路同这道题类似,只是多了一个赋0的操作。
第一种思路:将非0的元素前移,移动的距离为当前位置前面的0的个数。

代码1

/*
思路类似 删除数组值为0的无素
只是比其多了一步,为最后几个元素赋0
*/
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int cnt = 0, len = nums.size();
        for(int i = 0; i < len; ++i){//统计0的个数并移动元素
            if(nums[i] == 0){
                ++cnt;
            }
            else{
                nums[i - cnt] = nums[i];
            }
        }
        for(int i = len - 1; i >= len - cnt; --i){//将最后几个元素赋值为0
            nums[i] = 0;
        }
    }
};

执行结果1

在这里插入图片描述

题解2

双指针,一个用于遍历原数组,另一个用于将非0元素填入原数组。

代码2

/*
双指针,一个用于遍历原数组,另一个用于赋值
*/
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int i = 0, j = 0, len = nums.size();
        for(; i < len; ++i){
            if(nums[i] != 0){
                nums[j++] = nums[i];
            }
        }
        for(j; j < len; ++j){
            nums[j] = 0;
        }
    }
};

执行结果

在这里插入图片描述

发布了152 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/happyeveryday62/article/details/104104791