给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。
请注意,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0]
示例 2:
输入: nums = [0] 输出: [0]
提示:
1 <= nums.length <= 104
双指针解法
1、创建左指针和右指针,初始化都为0
2、左指针需要找到最前面为0的数字,右指针需要找到最前面不为0的数字,然后交换。
有两个关键点,无论怎么样,每次循环r指针都要往前走一格,r指针为非0时,l和r指向的数据交换,l再往前走一格。
class Solution { public: void moveZeroes(vector<int>& nums) { int n=nums.size(); if(n<2) return ; int left=0,right=0; while(1){ if(nums[right]){ std::swap(nums[left],nums[right]); left++; } right++; if(right==n) break; } } };