在学习了基础语法之后,是时候通过实际题目来巩固一下双指针技巧了。今天我们来拆解两道经典的数组操作题:移动零和复写零。
一、移动零
题目描述
给定一个数组 nums,要求将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。注意,必须在原地完成操作,不能创建新数组。

思路解析
初看这道题,很多人会想到新建一个数组把非零元素存进去再补零。但题目限制了空间复杂度,我们必须原地修改。
这里可以使用双指针法:
- 快指针 (
current):负责遍历整个数组,寻找非零元素。 - 慢指针 (
writeIdx):指向当前应该放置非零元素的位置。
当 current 遇到非零数时,将其交换到 writeIdx 位置,然后 writeIdx 后移。无论是否交换,current 都会继续前进。这样能保证所有非零元素按原顺序前移,剩余的尾部自然填充为 0。

代码实现
void Swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void moveZeroes(int* nums, int numsSize) {
int current = 0;
int writeIdx = 0;
while (current < numsSize) {
if (nums[current] != 0) {
Swap(&nums[writeIdx], &nums[current]);
writeIdx++;
}
current++;
}
}
这段代码提交后能顺利通过测试。核心在于理解 writeIdx 只会在遇到有效数据时才推进,从而自动将 0'挤'到了后面。



