283. Move Zeroes

1、題目數組

  一、審題spa

  

 

  二、分析指針

    給出一個整形數組,將 0 所有提到後邊,並保持非 0 元素的排列順序。code

 

2、解答blog

  一、思路class

    方法1、變量

      採用兩個指針,index1 指向 第一個 0 的下標。i 指向新出現的元素的下標。方法

      若 nums[i] = 0,則 i++;im

      若 nums[i] != 0, 且 i != index1,則交換 i 與 index1 所指向的兩個元素值;且 index1++,i++;img

      最終結果爲,將出現的 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;
    }

 

  方法2、

    改進:

    最終結果爲,非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++;
            }
        }
    }

 

  方法3、

    新建變量 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;
    }
相關文章
相關標籤/搜索