力扣【LeetCode】—— 283.零移动【java】

题目地址:https://leetcode-cn.com/problems/move-zeroes/

题目:
题目:

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

示例:

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

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

说明:

 必须在原数组上操作,不能拷贝额外的数组。

 尽量减少操作次数。

  • 方案1(两次循环)

    思路:统计所有非0数字的个数,统计的过程中依次将非0的数字存放到数组,最后填充0即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Solution {
    public void moveZeroes(int[] nums) {
    int j=0;
    for(int i=0;i<nums.length;i++){
    if(nums[i] != 0){
    //如果不等于0,则依次存储在j的下标
    // j++ 方便后面补0
    nums[j] = nums[i];
    j++; // ++可以直接放在上面下标中
    }
    }
    // 补 0
    for(int i=j;i<nums.length;i++){
    nums[i] = 0;
    }
    }
    }
  • 方案2(一次循环):

    思路:快慢指针,slow 指针从前往后遍历,找到0后停下来,fast 依次遍历,如果找到非0的值,并且slow 和fast 不是同步的时候(即fast>slow),说明slow 位置一定为0 ,替换两个值即可,最后slow ++(因为原来0的位置已经替换成非0数字了)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Solution {
    public static int[] moveZeroes2(int[] arrays) {
    int slow = 0; // 慢指针
    for (int fast = 0; fast < arrays.length;fast++) {
    if (arrays[fast] != 0) {
    if (fast > slow) {
    int temp = arrays[fast]; // 替换位置
    arrays[fast] = arrays[slow];
    arrays[slow] = temp;
    }
    slow ++;
    }
    }
    return arrays;
    }
    }

力扣【LeetCode】—— 283.零移动【java】
http://yoursite.com/post/e750af81.html/
Author
Chase Wang
Posted on
November 24, 2020
Licensed under