539. 移动零

给一个数组 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

这样有效的减少了操作数

posted @ 2018-01-05 07:16  三人木君  阅读(197)  评论(0编辑  收藏  举报