给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入:
[0,1,0,3,12]
输出:
[1,3,12,0,0]
说明:
1、必须在原数组上操作,不能拷贝额外的数组。
2、尽量减少操作次数。
解析:
如果没有空间的限制,可以用额外数组来完成,但是题目中有限制,就不能采用这种方法了。需要用到双指针的方法,一个指针start指到当前第一个0的位置,end指到当前遍历位置,用遍历到的非0元素去覆盖0元素,然后在数组的尾部添加0元素即可。还有一种方法就是交换两个指针位置的元素。
代码:
void moveZeroes(vector<int>& nums)
{
if (nums.empty())
return;
int start = 0;//定义两个指针
int end = 0;
while (end < nums.size())//遍历数组,用非零元覆盖零元
{
if (nums[end] != 0)
{
nums[start] = nums[end];
start++;
}
end++;
}
while (start < nums.size())//最后一个非零元后面全部设置为0
{
nums[start] = 0;
start++;
}
}
交换元素。
void moveZeroes(vector<int>& nums) {
int first=0;
int second=0;
while(first<nums.size())
{
if(nums[first]!=0)
{
swap(nums[first],nums[second]);
++second;
}
++first;
}
}