给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
一个指针指向最左侧的零,一个int记录已经遇到的0的长度;如果下一个是0,就直接把长度+1;如果不是,就交换最左侧的零和nums[i],然后left++
注意判断的时候要先判断i是否小于n再判断nums[i],否则会导致内存越界
1 class Solution { 2 public: 3 void moveZeroes(vector<int>& nums) { 4 int n=nums.size(); 5 if(!n) 6 return ; 7 int left=0,len=0; 8 for(int i=0;i<n;++i){ 9 if(len==0){ 10 while(i<n && nums[i]!=0) 11 ++i; 12 if(i==n) 13 return ; 14 left=i; 15 ++len; 16 } 17 else{ 18 if(nums[i]==0) 19 ++len; 20 else{ 21 swap(nums[left],nums[i]); 22 ++left; 23 } 24 } 25 } 26 return ; 27 } 28 };