题目
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例
输入:[0,1,0,3,12]
输出:[1,3,12,0,0]
说明
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
解法
解法1:双指针
i 为慢指针,j 为快指针,用快指针遍历数组,在遍历到非零元素时,将其放置 i 指向的位置。
完整遍历数组后,所有非零的元素已经移动到数组前方,且 i 记录了数组中非零元素的个数,依据此可求得数组中零的个数,再遍历将后面的元素全部置为零即可。
void moveZeroes(vector<int>& nums) {
int i = 0;
for(int j = 0;j < nums.size();j++)
{
if(nums[j] != 0)
{
nums[i] = nums[j];
++i;
}
}
// int zeroNums = nums.size() - i;
for(int k = nums.size()-1;k >= i;k--)
{
nums[k] = 0;
}
}
官方题解链接
https://leetcode-cn.com/problems/move-zeroes/solution/yi-dong-ling-by-leetcode-solution/
使用swap函数可简化解法