题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
思路:利用快慢指针解决
过程:初始状态:nums = [0,1,0,3,12]
slow = 0, fast = 0
第一次循环:
fast = 0,nums[0] = 0,不满足条件,fast++
fast = 1,nums[1] = 1,满足条件,交换nums[0]和nums[1],nums = [1,0,0,3,12],slow = 1,fast++
第二次循环:
fast = 2,nums[2] = 0,不满足条件,fast++
fast = 3,nums[3] = 3,满足条件,交换nums[3]和nums[1],nums = [1,3,0,0,12],slow = 2,fast++
第三次循环:
fast = 4,nums[4] = 12,满足条件,交换nums[4]和nums[2],nums = [1,3,12,0,0],slow = 3,fast++
循环结束,最终结果为nums = [1,3,12,0,0]
语法知识:
1.swap()交换函数
代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slow=0;
for(int fast=0;fast<nums.size();fast++)
{
if(nums[fast])
{
swap(nums[fast],nums[slow]);
slow++;
}
}
}
};