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

浙公网安备 33010602011771号