题目跳转: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,即第二个循环。
感叹一下:自己还是太菜了