程序员数据结构和算法分析

leecode刷题(8)-- 移动零

2019-01-16  本文已影响5人  希希里之海

leecode刷题(8)-- 移动零

移动零

描述:

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

示例:

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

说明:

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

思路:

依据题目,我们将数组中值不为 0 的元素往前移,将值为 0 的元素移动到最后面。可以设置一个数组元素下标,初始化为 0,从前往后遍历数组,当遇到值为 0 的元素时让其和初始化为 0 的下标对应的元素交换,然后下标加 1 ,这样遍历下来,我们便将值不为 0 的元素移动到了前面,值为 0 的元素自然而然就放在后面了。

代码如下:

import java.util.Arrays;

public class MoveZeroes {
    public static void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1) {
            return ;
        }
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                int temp = nums[i];
                nums[i] = nums[index];
                nums[index++] = temp;
            }
        }
    }

    public static void main(String[] args) {
        int[] nums = {0,1,0,3,12};
        moveZeroes(nums);
        System.out.println(Arrays.toString(nums));
    }
}

另一种写法:

这种写法和刚刚的写法差不多,把数组中所有的非零元素,按顺序给数组的前段元素位赋值,剩下的全部直接赋值0。其实和上边相比,就多了个赋值 0 的操作,还没那么简洁,建议采取第一种(破涕而笑)。但是还是自己写出来的,记录一下,哈哈。

import java.util.Arrays;

public class MoveZeroes {
    public static void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1) {
            return ;
        }
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[index] = nums[i];
                ++index;
                /*
                nums[index] = nums[i];
                ++index;
                这两句可以简写成:
                nums[index++] = nums[i]; 简化一点
                */
            }
        }
        for (int i = index; i < nums.length; i++) {
            nums[i] = 0;
        }
    }

    public static void main(String[] args) {
        int[] nums = {0,1,0,3,12};
        moveZeroes(nums);
        System.out.println(Arrays.toString(nums));
    }
}
上一篇下一篇

猜你喜欢

热点阅读