复写零
题目描述


题目要求在原地修改数组,将每个零重复出现一次。超出原数组长度的元素将被截断。
解题思路
这道题可以通过双指针解决。模拟复写过程:

使用两个指针 cur 和 dest。cur 遍历原数组,dest 记录写入位置。如果当前元素为 0,dest 增加 2;否则增加 1。当 dest 越界时停止。
需要注意边界情况:如果第二个零导致越界,则将原数组最后一个位置置为零。
找到最后一个复写的数后,从后向前进行实际复写操作。
代码实现
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
// 找到最后一个复写的数
int cur = 0, dest = -1;
while(cur < arr.size()) {
if(arr[cur]) dest++;
else dest += 2;
// 边界验证的辅助条件
if(dest >= arr.size() - 1) break;
cur++;
}
// 处理边界情况 并且进行第一步复写
(dest == arr.()) {
arr[dest - ] = ;
dest -= , cur--;
}
(cur >= ) {
(arr[cur]) arr[dest--] = arr[cur];
arr[dest--] = , arr[dest--] = ;
cur--;
}
}
};





