1. 程式人生 > 實用技巧 >雙指標:283. 移動零

雙指標:283. 移動零

分析題目:

  • 將0移動到末尾
  • 保持原有數字順序
  • 要in-place

看到這個題目,想到了計數排序的方式,數數有多少個0,放在後面。這點總是沒有問題的。

老是記著原來好像見過類似的題目,由此產生思路:

把陣列分為:無零數區,0區,未篩選區

兩個指標,一個指向0區的開頭位置(pZero),一個指向未篩選區的開頭位置(pNum)

如果發現pNum指向為0,pNum直接右移即可

如果發現pNum指向數,和pZero值交換位置,指標都右移即可

重點是把0區放在“中間”,而不是最後的區域,那樣是很不適合做交換的。

然而我搞得麻煩了一點,pNum當然初值設定為0,但按照這個圖的思想,把pZero初始值設定為-1

這樣對於pZero為-1時還需要特判,搞得好像有點麻煩:

class Solution {
    public void moveZeroes(int[] nums) {
        int pZero=-1,pNum=0;
        while(pNum<nums.length)
        {
            if(nums[pNum]==0)
            {
                if(pZero==-1)
                {
                    pZero=pNum;
                    pNum
++; } else { pNum++; } } else if(nums[pNum]!=0) { if(pZero==-1) { pNum++; }
else { nums[pZero]=nums[pNum]; nums[pNum]=0; pZero++; pNum++; } } } } }

有更加簡潔的演算法,但是我覺得還是我這個比較易懂,倒是可以把num++提出來,然後就只剩下兩個判斷分支了