zoukankan      html  css  js  c++  java
  • 一、数组---移动零※※※※※※

    给定一个数组 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 };
  • 相关阅读:
    2009年度最佳jQuery插件
    转:Jeff Dean的Stanford演讲
    Zookeeper的RPC框架
    转:电商推荐技术
    NoSQL设计思想(从辅到主)
    工作一年小结
    转:MySQL索引背后的数据结构
    java多线程并发,java的几种状态
    转发:Linux Socket编程
    几个linux shell的讲解网站
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11002384.html
Copyright © 2011-2022 走看看