【练习】【双指针】力扣热题100 283. 移动零

题目

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入:

nums = [0,1,0,3,12]

输出:

[1,3,12,0,0]

示例 2:

输入:

nums = [0]
输出:

[0]

来源:力扣热题100 283. 移动零


思路(注意事项)

学习remove()函数的用法


纯代码

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int t = 0;
        for (auto i : nums)
            if (i == 0) t ++;
        
        nums.erase(remove (nums.begin(), nums.end(), 0), nums.end());

        for (int i = 0; i < t; i ++) nums.push_back(0);
    }
};

题解(加注释)

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int t = 0;  // 用于统计数组中 0 的个数

        // 遍历数组,统计 0 的个数
        for (auto i : nums) {
            if (i == 0) {
                t++;  // 如果当前元素是 0,计数器 t 加 1
            }
        }

        // 使用 remove 和 erase 删除所有 0
        // remove 将非 0 元素移动到数组前面,并返回新的逻辑结尾
        // erase 删除从新结尾到原结尾的所有元素(即删除所有 0)
        nums.erase(remove(nums.begin(), nums.end(), 0), nums.end());

        // 在数组末尾添加 t 个 0
        for (int i = 0; i < t; i++) {
            nums.push_back(0);
        }
    }
};

你可能感兴趣的:(输入输出,力扣,hot100,leetcode,算法,c++)