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;
}