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

  • 相关阅读:
    javascript 文档标题滚动 实例
    Unity3D初学之2D动画制
    Uni2D 入门 -- Skeletal Animation
    Uni2D 入门 -- Asset Table
    Uni2D 入门 -- Atlas转载 http://blog.csdn.net/kakashi8841/article/details/17588095
    Uni2D 入门 -- Animation Clip 和 Animation API
    Uni2D入门
    将博客搬至CSDN
    unity 2048Game
    c#单例模式
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/13813692.html
Copyright © 2020-2023  润新知