
前言
本文聚焦 LeetCode'原地复写零'经典题目,核心需求是在固定长度数组中复写每个 0 并右移其余元素,且需满足原地修改、不使用额外数组空间的约束。正向遍历易导致后续元素被覆盖,为此详解双指针 + 逆向填充的优雅解法,高效破解这一核心难点。
一、复写零

二、思路分析
复写零这道题是让在原数组修改,如果从前向后遍历,后面的元素会被覆盖,所以我们要找到被复写的最后一个元素,然后从后往前复写。运用双指针 + 逆向填充。
1. 找到复写的最后一个数
定义两个指针:cur 遍历原数组,pre 模拟复写后的数组指针;cur==0 时,pre 向后移动两位,cur!=0 时,pre 向后移动一位;当 pre>=n-1 时,停止遍历,这时,cur 指的就是要复写的最后一个元素。

边界情况:如下面这种情况,pre == n 时,说明要复写的最后一个元素是 0,这里单独处理。
将数组最后一位改为 0,也就是 n==0;cur 向前移动一位,pre 向前移动两位。

2. 开始从后往前复写
从 cur 向前遍历,cur != 0 时,就让 arr[pre] == arr[cur]; cur == 0 时,就让 pre 和 pre-1 位置的数都改为 0,然后继续向前复写。

三、代码展示
class Solution {
public void duplicateZeros(int[] arr) {
int , pre = -, n = arr.length;
(cur < n) {
(arr[cur] == ) {
pre += ;
} {
pre++;
}
(pre >= n - ) {
;
}
cur++;
}
(pre == n) {
arr[n - ] = ;
cur--;
pre -= ;
}
(cur >= ) {
(arr[cur] != ) {
arr[pre--] = arr[cur--];
} {
arr[pre--] = ;
arr[pre--] = ;
cur--;
}
}
}
}


