Leetcode 283 移动零

题目跳转:https://leetcode-cn.com/problems/move-zeroes/

拿到题目,瞄了一眼Tags,首先使用双指针方法暴力解决了本问题:

/*
 * @lc app=leetcode.cn id=283 lang=java
 *
 * [283] 移动零
 */
class Solution {
    public void moveZeroes(int[] nums) {
        int i = nums.length - 1;
        int j = -1;
        for(; i >= 0; i--){
            if(nums[i] == 0){
                for(j = i + 1; j < nums.length; j++){
                    nums[j-1] = nums[j];
                }
                nums[j-1] = 0;
            }
        }
    }
}

 然而这样子的后果就是:

   

 

心里有点不爽,仔细瞄了一眼Top Voted Solution,心里想:“当时做的时候也有这样的思路,怎么就没想下去呢?“

让我们来仔细看看Top Voted Solution:

// Shift non-zero values as far forward as possible
// Fill remaining space with zeros

public void moveZeroes(int[] nums) {
    if (nums == null || nums.length == 0) return;        

    int insertPos = 0;
    for (int num: nums) {
        if (num != 0) nums[insertPos++] = num;
    }        

    while (insertPos < nums.length) {
        nums[insertPos++] = 0;
    }
}

  代码第一行先进行特殊情况的判断。

  第一个循环主要是为了将数组中非0的数据按照原来的顺序排好,insertPos是为了记录当前存放非0数据的位置。

  在第一个循环结束后,我们获得了insertPos,知道了在原来容量的数组中拥有多少个非0的数据,接下来我们要做的就是将剩下的位置填充0,即第二个循环。

 

 

感叹一下:自己还是太菜了

  

 

posted @ 2019-07-25 11:51  ZJPang  阅读(112)  评论(0编辑  收藏  举报