双指针: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++提出来,然后就只剩下两个判断分支了

原文地址:https://www.cnblogs.com/take-it-easy/p/13813692.html