给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
方法:双指针
i指向第一个0;
j指向第一个非0;
将0一步一步向右移动,挨个处理每个0
1 class Solution { 2 public: 3 void moveZeroes(vector<int>& nums) { 4 int i=0,j=0; 5 for(;j<nums.size();j++) 6 { 7 while(i<nums.size() && nums[i]!=0) i++;//直到第一个0时,i停止 8 while(j<nums.size() && nums[j]==0) j++;//等于0时,是交换过后的位置了,所以这个时候k++,继续寻找下一个非0 9 if(j==nums.size()) break; 10 else if(i>j) continue; 11 else{//做交换的时候,一定是i+1 = j 12 int tmp = nums[j]; 13 nums[j] = nums[i]; 14 nums[i] = tmp;//这个时候i指向的是交换后的非0,j指向的是交换过来的0 15 i++;//减少了一次while,省了一点内存 16 } 17 } 18 }
1 class Solution { 2 public: 3 void moveZeroes(vector<int>& nums) { 4 int i=0; 5 for(int j=0;j<nums.size();j++){//j遇到0时候,此时由于上一轮i++了,所以这个时候i其实也是遇到这个0了 6 if(nums[j]!=0){ 7 nums[i] = nums[j]; 8 i++; 9 } 10 } 11 //这个时候要么i指向的是0,要么i之前指的非0,然后就交换了之后,i指的0;总之这个时候i指的都是0 12 while(i<nums.size()){ 13 nums[i++] = 0; 14 } 15 16 } 17 };