首页 > 移动平台 > 详细

一、数组---移动零※※※※※※

时间:2019-06-11 13:31:18      阅读:91      评论:0      收藏:0      [点我收藏+]

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

 

一、数组---移动零※※※※※※

原文:https://www.cnblogs.com/pacino12134/p/11002384.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!