leetcode刷题之1089: 复写零

 题目leetcode刷题之1089: 复写零_第1张图片

解题思路:

leetcode刷题之1089: 复写零_第2张图片

 leetcode刷题之1089: 复写零_第3张图片

2)处理边界情况

leetcode刷题之1089: 复写零_第4张图片            leetcode刷题之1089: 复写零_第5张图片

 这种情况越界会发生报错

处理边界情况

leetcode刷题之1089: 复写零_第6张图片leetcode刷题之1089: 复写零_第7张图片

 

3)  双指针法   "从后向前" 完成复写操作

leetcode刷题之1089: 复写零_第8张图片              leetcode刷题之1089: 复写零_第9张图片    cur指向 最后一个复写的数 ,     用cur指向的元素复写dest指向元素, 随后cur, dest 均向前移动一位

 leetcode刷题之1089: 复写零_第10张图片

此时cur指向零元素, 需要复写两位, 复写两个元素的dest 前移两位如下

 leetcode刷题之1089: 复写零_第11张图片             leetcode刷题之1089: 复写零_第12张图片

移动完dest后 移动cur指针, 进行下一轮循环复写

 leetcode刷题之1089: 复写零_第13张图片                   leetcode刷题之1089: 复写零_第14张图片

 继续先后移动dest 指向下标3位置, cur 指向下标2 位置,  执行循环复写操作

 leetcode刷题之1089: 复写零_第15张图片        leetcode刷题之1089: 复写零_第16张图片

 上图复写完后继续移动cur dest指针, cur 指向 零元素, 复写两次, 

 leetcode刷题之1089: 复写零_第17张图片                  leetcode刷题之1089: 复写零_第18张图片

dest 向前移动位, 再次在自身上复写

 leetcode刷题之1089: 复写零_第19张图片                     leetcode刷题之1089: 复写零_第20张图片

  最后均移动至-1 结束

 leetcode刷题之1089: 复写零_第21张图片

 

class Solution {
    public void duplicateZeros(int[] arr) {
        int cur = 0, dest = -1;
        while(cur < arr.length) {
        
            if(arr[cur] == 0) {
                dest++;
            }
            dest++;    
            if(dest >= arr.length-1) {
                break;
            }
            cur++;
        }
        if(dest >= arr.length) {
            arr[arr.length-1] = 0;
            cur--;
            dest-=2;
        }

        while(cur >= 0) {
            if(arr[cur] == 0) {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            } else {
                arr[dest--] = arr[cur--];
                
            }
        }
    }
}

leetcode刷题之1089: 复写零_第22张图片

 

你可能感兴趣的:(leetcode,算法,职场和发展)