力扣 1089 复写零
思路:双指针
第一步:利用指针 cur 去记录最后一位要复写的数 , 利用指针 dest 指向最后一位数所要复写的位置;
实现过程:最开始 cur 指向0,dest 指向 -1 , 当arr[cur] != 0 时,dest 走两步 ,否则 走一步 ; 判断dest是否已经处于数组最末端的位置 或者已经越界;
第二步: 如果数组已经越界 ,让 arr[arr.size()-1] = 0; dest -= 2; cur --;
第三步: 依次按要求从后往前完成复写。
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int cur = 0 , dest = -1;
//确定要复习的最后一位数,使用cur指针指向
while(cur < arr.size())
{
if(arr[cur] !=0)
{
dest++;
}else{
dest +=2;
}
//当dest指针指向数组最后一个位置或者越界一位,跳出循环,不再让cur 往后走
if(dest >= arr.size()-1)
{
break;
}
++cur;
}
// 如果dest处于arr.size()的位置
if(dest == arr.size())
{
arr[arr.size()-1] = 0;
dest -=2;
--cur;
}
// 从右往左依次完成复
while(cur >=0)
{
if(arr[cur])
{
arr[dest--] = arr[cur--];
}else{
arr[dest--] = 0;
arr[dest--] = 0;
cur--;
}
}
}
};