Hot100-Day25-T283移动零

11 阅读1分钟

Day25[26/3/25]T283移动零

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

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

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

进阶:你能尽量减少完成的操作次数吗?

解题思路

很简单,统计一个元素前面有几个 0,那么这个元素就需要向前移动几位,然后在处理的时候全部采用交换 std::swap() 就行

Code

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Solution
{
public:
    void moveZeroes(vector<int> &nums)
    {
        // 第一个数字是不是0
        int zeroCount = nums[0] ? 0 : 1;
        for (int i = 1; i < nums.size(); i++)
        {
            if (nums[i]) // 不是0
            {
                swap(nums[i - zeroCount], nums[i]);
            }
            else
            {
                zeroCount++;
            }
        }
    }
};

auto main() -> int
{
    vector<int> nums{0, 2, 0, 3, 4, 5, 0, 0, 6, 7};
    Solution sol;
    cout << "old : ";
    for (const auto &num : nums)
        cout << num << ",";
    cout << endl
         << "new : ";
    sol.moveZeroes(nums);
    for (const auto &num : nums)
        cout << num << ",";
    cout << endl;
}