给一个数组 nums 写一个函数将 0
移动到数组的最后面,非零元素保持原数组的顺序
注意事项
1.必须在原数组上操作
2.最小化操作数
样例
给出 nums = [0, 1, 0, 3, 12]
, 调用函数之后, nums = [1, 3, 12, 0, 0]
.
很羞愧,想了好一会也没想出什么很妙的方法,半天才写出来个无脑能AC的
1 void moveZeroes(vector<int>& nums) { 2 // write your code here 3 int right = nums.size()-1; 4 int temp; 5 for (int i = 0; i<=right;) { 6 if (nums[i] == 0) { 7 temp = i; 8 while (temp<right) { 9 swap(nums[temp], nums[temp+1]); 10 temp++; 11 } 12 right--; 13 } 14 else { 15 i++; 16 } 17 } 18 }
就是查到0就一路向后挪,挪到最后就定死不动了,所以再把最后位置向前挪一个
把i++放在else里面是因为有连续0的情况。
看看别人的解法把
1 void moveZeroes(vector<int>& nums) { 2 // Write your code here 3 int i = 0; 4 int j = 0; 5 int len = nums.size(); 6 while( i < len ) { 7 if( nums[i] != 0 ) { 8 nums[j] = nums[i]; 9 j++; 10 } 11 i++; 12 } 13 14 while( j < len ) { 15 nums[j] = 0; 16 j++; 17 } 18 }
第一个whilie中,j保证指向0的位置,这样当i指向非0数时,覆盖掉j指向位置
当覆盖完毕后,在后面补0
这样有效的减少了操作数