283. 移动零
题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。

思路: 采用 双指针。
核心思想:
一个指针寻找非零元素,另一个指针记录下一个非零元素应该放的位置。
具体过程:
-
i遍历整个数组,寻找非零元素。 -
i0指向下一个非零元素应该放的位置。 -
当找到非零元素时,与
i0位置交换,并将i0后移一位。 -
遍历结束后,所有非零元素都移动到前面,所有
0自然移动到末尾。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution {
public void moveZeroes(int[] nums) {
int i0 = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
// 交换 nums[i] 和 nums[i0]
int tmp = nums[i];
nums[i] = nums[i0];
nums[i0] = tmp;
i0++;
}
}
}
}