移动零(Java的2种算法实现)

    技术2022-07-10  145

    移动零


    题目

    移动零(力扣:283)

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

    说明:

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

    分析

    使用双指针解决。

    方法一:用2个指针i指向当前遍历的节点,j指向已排好序的当前非零节点的后一位。i指针位置的当前节点,如果是非零,则交换i和j的位置。

    方法二:第一次遍历将非零节点都移动到数组的前面,并计算出非零节点的数量s,完成遍历后,第二次遍历从s开始一直到数组末尾,设置为0即可。

    代码实现:方法一

    /** * 283. 移动零 * @param nums */ public void moveZeroes(int[] nums) { if (nums == null){ return; } int i = 0, j = 0; int tmp; while (i <nums.length){ if (nums[i] != 0){ tmp = nums[j]; nums[j] = nums[i]; nums[i] = tmp; j++; } i++; } }

    代码实现:方法二

    /** * 283. 移动零 * * @param nums */ public void moveZeroes2(int[] nums) { if (nums == null || nums.length <= 1) { return; } int s = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] != 0) { nums[s] = nums[i]; s++; } } for (int i = s; i < nums.length; i++) { nums[i] = 0; } }
    Processed: 0.010, SQL: 12