给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
输入: nums = [0]
输出: [0]
class Solution {
public:
void moveZeroes(vector<int>&nums)
{
//当数组为空,或者长度为1的时候返回原数组即可
if(nums.empty()||nums.size()==1)
{
return;
}
//建立双指针
int left=0;
int right=1;
int length=nums.size();
while(right<length)
{
//当左边为零,查找右边第一个不为0的值并进行交换
while(nums[left]==0&&right<length)
{
if(nums[right]!=0)
{
int temp=nums[right];
nums[right]=nums[left];
nums[left]=temp;
}
else
{
right++;
}
}
left++;
right++;
}
}
};
void moveZeroes2(vector<int>&nums)
{
int length=nums.size();
int left=0,right=0;
while(right<length)
{
//left 指向已经处理好数据的尾部
//right 指向将要处理的头部
//一开始是跟本身进行交换,但不影响结果
if(nums[right])
{
int temp=nums[right];
nums[right]=nums[left];
nums[left]=temp;
left++;
}
right++;
}
}