1 题目描述
283. 移动零要求给定一个整数数组 nums
,编写一个函数将所有的 0 移动到数组的末尾,同时保持非零元素的相对顺序不变。该操作必须在原地完成,即不能使用额外的数据结构来存储数组。
2 解题思路
我们可以使用双指针的方法来解决这个问题:
left
指针指向下一个可能放置非零元素的位置。right
指针用于遍历数组中的每一个元素。
当 right
指针遇到非零元素时,我们就把它交换到 left
指针所指向的位置,并将 left
指针向右移动一位。这样可以确保所有非零元素都被移到了数组的前面,而所有零元素都被移到了数组的后面。
3 Java 代码实现
public class Solution {
public void moveZeroes(int[] nums) {
int left = 0; // 指向非零元素应该放置的位置
int right = 0; // 遍历数组
for (; right < nums.length; right++) { // 右指针始终向右移动
if (nums[right] != 0) {
// 交换非零元素到 left 指针位置
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
// 将 left 指针向右移动一位
left++;
}
}
}
}
4 注意事项
- 双指针:使用双指针技术,其中
left
指针追踪新数组的当前位置,而right
指针用于遍历整个数组。 - 原地修改:直接在原数组上进行修改,不需要额外的空间。
- 非零元素的相对顺序:通过交换元素的方式保持非零元素的相对顺序。