分析题目:
- 将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++提出来,然后就只剩下两个判断分支了。