zoukankan      html  css  js  c++  java
  • 283. Move Zeroes

    一、题目

      1、审题

      

      2、分析

        给出一个整形数组,将 0 全部提到后边,并保持非 0 元素的排列顺序。

    二、解答

      1、思路

        方法一、

          采用两个指针,index1 指向 第一个 0 的下标。i 指向新出现的元素的下标。

          若 nums[i] = 0,则 i++;

          若 nums[i] != 0, 且 i != index1,则交换 i 与 index1 所指向的两个元素值;且 index1++,i++;

          最终结果为,将出现的 0 连起来,将后边的非 0 元素与前边的 0 序列的最前头一个进行交换。

        public void moveZeroes(int[] nums) {
            int len = nums.length;
            int ind1 = 0;
            for (int i = 0; i < len; i++) {
                if(nums[i] == 0) {
                    if(nums[ind1] != 0)
                        ind1 = i;
                    continue;
                }
                
                if(i > ind1 && nums[ind1] == 0) {
                    swap(nums, ind1, i);
                    ind1++;
                }
            }
        }
    
        private void swap(int[] nums, int i, int j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }

      方法二、

        改进:

        最终结果为,非0数全在前边, 0 在后边。

        public void moveZeroes3(int[] nums) {
            int j = 0;
            for (int i = 0; i < nums.length; i++) {
                if(nums[i] != 0) {
                    if(i != j)
                        swap(nums, i, j);
                    j++;
                }
            }
        }

      方法三、

        新建变量 insertPos=0; 将非 0 元素直接前移到 insertPos 位置,然后 insertPos++;

        最终若 insertPos < len;在将剩下的元素赋值 0;

        public void moveZeroes2(int[] nums) {
            int insertPos = 0;
            for(int num: nums)
                if(num != 0)
                    nums[insertPos++] = num;
            while(insertPos < nums.length)
                nums[insertPos++] = 0;
        }
  • 相关阅读:
    ant
    hudson
    【消息队列MQ】各类MQ比较
    日本出行
    使用Eclipse Installer安装Eclipse
    Firebug控制台详解
    浮动
    CSS3
    HTML制作视频简介
    使用I/O流复制指定文件
  • 原文地址:https://www.cnblogs.com/skillking/p/10009801.html
Copyright © 2011-2022 走看看