1、先找到最后一个数
比如示例1中答案的最后一个数是4
定义两个指针 dest 和 cur
dest初始位置是-1 cur初始位置为 0
如果arr[cur]为非零元素 dest位置+1
如果arr[cur]为零元素 dest位置+2
直到cur<arr.size() 或者 dest>=arr.size()-1
cur就是最后一个元素位置
2、dest越界 处理边界情况
dest==arr.size()时候
arr[arr.size()-1] = 0
cur--
dest - =2
3、从后向前完成覆写操作
循环条件是cur>=0
如果cur指向的为非零元素 dest位置替换成cur所指的元素 然后dest -- cur --
如果cur指向的为零元素 dest和dest-1位置都替换成0 然后 cur-- dest - = 2
直到覆写完
代码实现:
class Solution {
public:
void duplicateZeros(vector<int>& arr)
{
//1、先找最后一个数
int cur=0,dest=-1,n=arr.size();
while(cur<n)
{
if(arr[cur]!=0)
{
dest++;
}
else
{
dest+=2;
}
if(dest>=n-1) break;
cur++;
}
//2、处理边界情况
if(dest==n)
{
arr[n-1]=0;
cur--;
dest-=2;
}
//3、从后向前完成覆写操作
while(cur>=0)
{
if(arr[cur]!=0)
{
arr[dest]=arr[cur];
dest--;
cur--;
}
else
{
arr[dest]=0;
arr[dest-1]=0;
cur--;
dest-=2;
}
}
}
};