列表

详情


NC200. 移动 0

描述

给定一个数组,请你实现将所有 0 移动到数组末尾并且不改变其他数字的相对顺序。

数据范围:数组长度满足 ,数组中的元素满足

示例1

输入:

[1,2,0,3]

输出:

[1,2,3,0]

示例2

输入:

[1,2,3]

输出:

[1,2,3]

示例3

输入:

[0,0]

输出:

[0,0]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 396KB, 提交时间: 2022-02-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> moveZeroes(vector<int>& nums) {
        int n = nums.size(), left = 0, right = 0;
        while (right < n) {
            if (nums[right]) {
                swap(nums[left], nums[right]);
                left++;
            }
            right++;
        }
        return nums;
        // write code here
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 424KB, 提交时间: 2022-02-09

class Solution {
public:
    /*
    方法一:两次遍历(笨办法)
    */
    vector<int> moveZeroes1(vector<int>& nums) {
        if(nums.size()== 0) return nums;
        //第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
        int j = 0;
        for(int i=0; i<nums.size(); ++i) {
            if(nums[i] != 0) {
                nums[j++] = nums[i];
            }
        }
        //非0元素统计完了,剩下的都是0了
        //所以第二次遍历把末尾的元素都赋为0即可
        for(int i=j; i<nums.size(); ++i) {
            nums[i] = 0;
        }
        return nums;
    }

    /*
    思路同方法一,另一种实现
    将所有 0 移到最后,其实就相当于移除 nums 中的所有 0,然后再把后面的元素都赋值为 0 即可。

    参考:
    https://labuladong.gitee.io/algo/2/21/68/
    */
    vector<int> moveZeroes(vector<int>& nums) {
        // 去除 nums 中的所有 0
        // 返回去除 0 之后的数组长度
        int p = removeElement(nums, 0);
        // 将 p 之后的所有元素赋值为 0
        for (; p < nums.size(); p++) {
            nums[p] = 0;
        }
        return nums;
    }

    /*
    方法二:双指针

    思路及解法
    1. 使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。
    2. 右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。

    注意到以下性质:
    1. 左指针左边均为非零数;
    2. 右指针左边直到左指针处均为零。
    因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。

    举例:nums=[0,1,0,3,12]
    left=0, right=1, nums=[1,0,0,3,12] <--- 交换 left=1
    left=1, right=3, nums=[1,3,0,0,12] <--- 交换 left=2
    left=2, right=4, nums=[1,3,12,0,0] <--- 交换 left=3,循环结束!

    复杂度分析
    时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。
    空间复杂度:O(1)。只需要常数的空间存放若干变量。
    */
    vector<int> moveZeroes2(vector<int>& nums) {
        int n = nums.size(), left = 0, right = 0;
        while (right < n) {
            if (nums[right]) {
                swap(nums[left], nums[right]);
                left++;
            }
            right++;
        }
        return nums;
    }

private:
    // 双指针技巧,复用 [27. 移除元素] 的解法。
    int removeElement(vector<int> &nums, int val) {
        int fast = 0, slow = 0;
        while (fast < nums.size()) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 436KB, 提交时间: 2022-02-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> moveZeroes(vector<int>& nums) {
        // write code here
        vector<int> res;
        int countN = 0;
        for(int i = 0;i < nums.size();i++){
            if(nums[i]!=0){
                countN++;
                res.push_back(nums[i]);
            }
        }
        for(int i = countN;i < nums.size();i++)
            res.push_back(0);
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 384KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> moveZeroes(vector<int>& nums) {
        // write code here
        if(nums.size() < 2){
            return nums;
        }
        
        for(int i=0; i < nums.size(); i++){
            if(nums[i] != 0){
                continue;
            }
            for(int j=i+1; j < nums.size(); j++){
                if(nums[j] != 0){
                    swap(nums[i], nums[j]);
                    break;
                }
            }
        }
        
        return nums;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 384KB, 提交时间: 2022-06-16

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> moveZeroes(vector<int>& nums) {
        // write code here
        int n=nums.size();
        auto i=nums.begin();
        while(n--){
            if(*i==0) {
                nums.erase(i);
                nums.push_back(0);
                i--;
            }
            i++;
        }
        return nums;
    }
};

上一题