双指针处理数组:移动零与复写零
一、移动零
题目描述

思路
这题本质上是在原数组里做一次稳定划分:非零元素尽量靠前,零留在后面。常见做法是维护两个指针,cur 负责扫描,dest 负责记录下一个非零元素该落的位置。
我更喜欢把它理解成三个区间:
[0, dest]:已经放好的非零元素(dest, cur):已经确认是零,但还没必要单独处理[cur, n):还没扫到的部分
这样看,逻辑就很顺。
遍历时只要遇到非零元素,就把它交换到 dest 后面一格,再让 dest 前进。零不需要做任何事,cur 继续往后走就行。这样不会漏,也不需要额外数组。
代码实现
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int dest = -1, cur = 0;
// cur 每轮都会自增,所以不需要单独处理遇到 0 的情况
for (; cur < nums.size(); cur++) {
if (nums[cur]) {
// 遇到非 0 元素时,将其交换到 dest 后一位
swap(nums[++dest], nums[cur]);
}
}
}
};
二、复写零
题目描述



