刷题之旅从数组类型的题目开始。第十八道题目是移动零,对应leetcode的题号为283。

image

题目描述

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

示例:

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

说明:

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

解题思路

一个简单的思路是复制一个等长的数组,然后前面放非零元素即可,不过题目说明不能拷贝额外的数组空间。那么其实没有这个辅助数组,按照这个思想也是一样的。

我们只需要遍历数组,把非零元素逐个往前面放即可,最后没有放满的地方全部赋予零即可。这样既保证了非零元素的相对顺序,又不需要开拓新数组。

提交代码

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public void moveZeroes(int[] nums) {
int j = 0;
for(int i=0;i<nums.length;i++){
if(nums[i] != 0){
nums[j++] = nums[i];
}
}
while(j < nums.length){
nums[j++] = 0;
}
}
}

执行结果:

1
2
执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 :37.8 MB, 在所有 Java 提交中击败了95.42%的用户