leetcode 283. 移动零


本题 题目链接

题目描述


我的题解

方法一:

思路分析

  • 慢指针cur记录当前可以被覆盖的位置,快指针i从头到尾遍历数组:
    • 当nums[i]!=0的时候,用i位置的元素覆盖cur位置的元素,然后i++,cur++。
    • 若nums[i]=0,只有i++.
  • 并不会造成值的丢失:
    • 第一次循环的时候,若nums[i]非零,此时执行nums[cur] = nums[i],i 与 cur 的值一致,并不会造成数据的丢失。
      此后i++,cur++,然后进入第二次循环,在遇到值为0的元素之前,i与cur的值一直保持一致。
    • 当第一次遇到值为 0 的时候,只有i执行了加一操作,此时,cur与i已经不相等了,而cur指向的刚好就是这个值为0的位置(因为在之前cur有+1呀)。
      继续执行循环,当遇到nums[i]非零时,nums[cur]=nums[i],此时nums[i]覆盖的值是0,无所谓~
      而 i 这个位置的值也被记录下来了,哪怕后续cur指向了这个i的位置,也无所畏惧了~
  • 循环结束之后呢,还有一个循环,这个循环是为了把cur后面的元素都赋值为0(因为上一个循环中,i走在cur前面,把非零元素的值都拿出来了,拿出来后,i 位置的值还留在那里 并没有被更换为0)
    public void moveZeroes(int[] nums) {
        if(nums == null) return ;
        int cur = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[cur++] = nums[i];
            }
        }
        while (cur < nums.length)nums[cur++] = 0;
    }

原文地址:https://www.cnblogs.com/duduwy/p/13410876.html