/*
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,
同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
*/
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
//用i索引标记0,用j索引标记非0,只要满足nums[i]==0&&nums[j]!=0,则交换nums[i]和nums[j],如果不满足,则i++直到第一个为0的元素,j也++直到第一个不为0的元素
void moveZeros(vector<int>& nums) {
int i=0;
int j=0;
while(j<nums.size())
{
if(nums[i]==0 && nums[j]!=0)
{
swap(nums[i],nums[j]);
}
while(nums[i]!=0)
i++;
while(nums[j]==0)
j++;
}
}
//从头到尾扫描一遍数组,把所有的非0元素全部赋值给前面从0开始的所有元素,直到把剩下的后面的所有元素全部赋值为0
void moveZeros2(vector<int> &nums)
{
int j=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]!=0)
{
nums[j]=nums[i];
j++;
}
}
for(;j<nums.size();j++)
{
nums[j]=0;
}
}
};
int main()
{
Solution s;
vector<int> vec{0,1,0,3,12};
s.moveZeros(vec);
for(auto i:vec)
{
cout<<i<<" ";
}
cout<<endl;
}
LeetCode283:MoveZero
最新推荐文章于 2022-04-11 06:00:28 发布