283.移动零

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

示例:

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

说明:

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

Solution

交换只会发生在fast指向不是0的情况下,一般是原地交换,如果fast为0,就会继续移动,实际上是while循环的逻辑,而此时慢指针刚好指向0,完成交换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
// moveZeroes方法用于将所有0移至数组末尾,同时保持非零元素的相对顺序
public void moveZeroes(int[] nums) {
// n是数组的长度
int n = nums.length;
// slow指针用于记录下一个非零元素应该放置的位置
int slow = 0;
// fast指针用于探索数组,寻找非零元素
int fast = 0;
// 遍历数组直到fast指针到达数组末尾
while (fast < n) {
// 如果fast指向的元素不是0
if (nums[fast] != 0) {
// 交换slow和fast指向的元素,将非零元素移动到其应在的位置
swap(nums, slow, fast);
// 移动slow指针,为下一个非零元素准备位置
slow++;
}
// 移动fast指针,继续探索数组
fast++;
}
}

// swap方法用于交换数组中两个位置的元素
public void swap(int[] nums, int slow, int fast) {
// 临时保存slow位置的元素
int temp = nums[slow];
// 将fast位置的元素赋给slow位置
nums[slow] = nums[fast];
// 将原slow位置的元素赋给fast位置
nums[fast] = temp;
}
}