思路:1.先找出最后一个要复写的值
2.然后从后往前复写,从前往后的话,值会被覆盖,可以自己动手画一下
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
//先找最后一个要复写的下标
int cur = 0;
int dest = -1;
while(dest < (int)arr.size() - 1) //这里dest到最后的位置,或者溢出了就要退出循环
{
if(arr[cur] == 0)
{
dest += 2;
}
else
{
dest++;
}
if(dest < (int)arr.size() - 1) 这个判断不写,cur会多++一次
cur++;
}
if(dest == arr.size()) //这是用来处理特殊情况了,例如[1,0,2,3,0,4]
{
arr[arr.size() - 1] = 0;
cur--;
dest -= 2;
}
cout<<cur<<" "<<dest<<endl;
//cout<<arr[cur]<<endl<<arr[dest];
//然后就是从右往左,进行复习,从左往右的话,数据会被覆盖
while(cur >= 0)
{
if(arr[cur] == 0)
{
arr[dest--] = 0;
arr[dest--] = 0;
}
else
{
arr[dest--] = arr[cur];
}
cur--;
}
}
};