雙指標:283. 移動零
阿新 • • 發佈:2020-10-14
分析題目:
- 將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++提出來,然後就只剩下兩個判斷分支了。