移动零
针对这种数组分块、数组划分的问题,可以考虑使用双指针(前后双指针)思想进行划分。

代码实现
void moveZeroes(vector<int>& nums) {
int left = -1, cur = 0;
while (cur < nums.size()) {
if (nums[cur] != 0) swap(nums[++left], nums[cur]);
cur++;
}
}
复写零
(错误) 决策一:利用双指针从前向后遍历时往 dest 上填写会发现行不通,它会把之后的数覆盖。
因此我们只能考虑从后向前的策略完成复写。

决策二:从后向前复写
难点 1: 如何确定 cur 从哪里开始向前遍历? 难点 2: 是否含有边界情况?如何处理?
此类题是半模拟题,需要不断地画图总结。
定义 cur 指向下标为 0 的位置,dest 指向 -1,通过遍历 cur 并让其指向的值决定 dest 是走一步还是走两步,当 dest>=n-1 时即找到了 cur 的位置。
特殊情况:通过上述方法,处理情况 2 时会发现 dest==n,因此需要把 arr[n-1]=0,同时 cur--, dest-=2。

代码实现
void duplicateZeros(vector<int>& arr) {
// 确定 cur 的位置
int cur = 0, dest = -1, n = arr.();
(cur < n) {
(arr[cur] == ) dest += ;
dest++;
(dest >= n - ) ;
cur++;
}
(dest == n) {
arr[n - ] = ;
cur--;
dest -= ;
}
(cur >= ) {
(arr[cur] == ) {
arr[dest--] = ;
arr[dest--] = ;
} arr[dest--] = arr[cur];
cur--;
}
}










