283:移动零

问题描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  • 必须在原数组上操作,不能拷贝额外的数组。
  • 尽量减少操作次数。

思路

可以设置一个real指针,把不等于0的值都放在real指针处。最后把real指针后面的值全部置为0.(方法一)
也可以设置一个假设是指向最开头的0的指针。遇到不是0的值,就把这个元素和最开头的0交换即可。(方法二)
方法二在大量0的情况下比方法一表现要好。不过方法二并不是很容易理解,我画一下过程。

[0,1,0,3,12]

扫描到0时,方法二的firstZero并不更新。
扫描到1时,firstZero交换,并更新为1,变为:

[1,0,0,3,12]

发现了没,此时firstZero还是指向第一个0的。
为啥是这样呢?
因为咱们碰见0的时候,是不更新firstZero的。碰见非0的时候,才会交换,并且更新firstZero。 所以firstZero指向的永远是第一个0.

方法一

Java版

class Solution {
    public void moveZeroes(int[] nums) {
        int realPtr = 0;
        for(int i = 0; i < nums.length; i++){
            if(nums[i] != 0){
                nums[realPtr++] = nums[i];
            }
        }
        for(int i = realPtr; i < nums.length; i++){
            nums[i] = 0;
        }
    }
}

方法二

Java版

class Solution {
    public void moveZeroes(int[] nums) {
        int firstZero = 0;
        for(int i = 0; i < nums.length; i++){
            if(nums[i] != 0){
                int tmp = nums[i];
                nums[i] = nums[firstZero];
                nums[firstZero++] = tmp;
            }
        }
    }
}
发布了396 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/104887608