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

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

 

posted @ 2019-06-11 10:58  Austin_anheqiao  阅读(162)  评论(0编辑  收藏  举报