1. 上期优解思路参考代码
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int cur = 0, dest = -1, n = arr.size();
// 找位置
while (cur < n) {
if (arr[cur]) // 判断 cur
dest++;
else
dest += 2;
if (dest >= n - 1) // 判断停止
break;
cur++;
}
if (dest == n) // 处理特殊情况
{
arr[n - 1] = 0;
cur--;
dest -= 2;
}
while (cur >= 0) // 执行从后往前复写
{
if (arr[cur])
arr[dest--] = arr[cur--]; // 后置--先使用再--
else {
arr[dest--] = 0;
arr[dest--] = 0;
cur--;
}
}
}
};
有不懂的点,大家可以在评论区讨论一下,如果是第一次接触这种模拟加双指针的题目发蒙很正常,接触多了就好了。道阻且长,行则将至,一起加油吧。
如果参考代码有错误,欢迎大家批评指正!
2. 本期题目解析





