力扣 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--;}}}
};