0%

移动零

题目

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

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:

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

思路

  • 最初想法:
    1. 遍历数组, 维护首尾两指针, 若当前元素为0, 则与尾指针指向的元素互换位置
    2. 每次循环, 头指针加一, 尾指针指向元素若不为0则一直减一
    3. 当头指针+1=尾指针, 循环结束.

但是这样得到的数组并不能保证原来顺序.

  • 实现:
    1. 遍历两次, 第一次获取到不为0的元素并按照顺序放到数组
    2. 第二次将剩余置空

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
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;
}
}