题目名称(附链接)
移动零链接:https://leetcode.cn/problems/move-zeroes/description/
一、题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
二、思路
利用双指针法来进行解答。
第一步:我们先定义两个指针,一个是cur(从左向右遍历数组),一个是dest(已处理的区间的最后一个元素位置)
第二步:将数组分为三段,第一段数组下标:[0,dest],第二段数组下标:[dest+1,cur-1],第三段下标:[cur,n-1]。

第一段划分出来代表:这个区间是非0元素
第二段划分出来代表:这个区间是0元素
第三段划分出来代表:这个区间是未划分元素区间。
第三步:设置初始值
将dest指针初始位置设为-1;cur初始位置设为0。
如果cur指向的元素为0,cur++,后移,如果cur指向的元素为非0元素,让cur位置的元素和dest+1位置的元素进行交换。一直重复这个动作,直到cur走到数组长度的位置,就完成操作了。
三、关键点
- 边界条件:注意指针位置的区间取值
四、代码(Java )
java
class Solution {
public void moveZeroes(int[] nums) {
for (int cur = 0, dest = -1; cur < nums.length; cur++) {
if (nums[cur] != 0) {
int tmp = nums[cur];
nums[cur] = nums[dest + 1];
nums[dest + 1] = tmp;
dest++;
}
}
}
}
五、总结
五、总结
-
这题属于什么类型?
这道题属于数组处理中的双指针(或数组划分)问题,本质是通过控制指针来对数组进行原地调整。
-
学到了什么套路?
通过双指针将数组动态划分为"已处理区"和"未处理区",在遍历过程中不断调整元素位置,从而在不额外使用空间的情况下完成操作。同时也加深了对双指针在数组重排问题中应用的理解。