学习笔记--算法(双指针)2

复写零

链接:https://leetcode.cn/problems/duplicate-zeros/


题目

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

示例 1:

输入:arr = [1,0,2,3,0,4,5,0]

输出:[1,0,0,2,3,0,0,4]

解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

示例 2:

输入:arr = [1,2,3]

输出:[1,2,3]

解释:调用函数后,输入的数组将被修改为:[1,2,3]


过程

1.先找到最后一个"复写"的数(虚假复写)

双指针算法:

a. 先判断 cur 位置的值;

b. 决定dest 向后移动一步或者两步;

c. 判断一下 dest 是否已经到结束为止;

d. cur++。

演示图:

2.处理边界情况

判断 dest 是否越界到 n 的位置:

如果越界,执⾏下⾯三步:

  1. n - 1 位置的值修改成 0 ;

  2. cur 向移动⼀步;

  3. dest 向前移动两步。

3.真实复写

A.cur的元素值不为0,dest的元素值就只要写一个跟cur元素值一样的数即可!

B.cur的元素值为0,dest的元素值就需要先写为0,然后让dest--,再让移动后的dest的元素值写为0.

上面的动态演示图演示如何查找最后一个**"复写"的数,**接下来就是根据最后确定下来的cur和dest位置,然后"从后向前"完成真实复写操作的演示:

结束!


特例

[1,0,2,3,0,4]

这种情况在虚假复写时,dest会在最后复写两次0,导致dest走到了数组边界外(正常数组下标范围定义:0 ~ n-1,n表示数组的长度,即有多少个元素),会引起报错;

为了处理错误,需要将n-1下标的元素改为0,再让cur向前走一步,dest向前走两步,再继续真实复写。

演示:

结束!

代码

public void duplicateZeros(int[] arr) {
    int cur = 0;
    int dest = -1;//dest定义为-1,是因为dest是要表示为最后一个需要复写的位置,也就是说,dest就是复写后结果集里最后一个元素,当dest走到数组的边界,就停止复写,而刚开始并不知道最后一个位置在哪,所以定义为-1
    int n = arr.length;
    //先找到最后一个"复写"的数
    while(cur < n){
        //判断cur的元素值是否为0,为0就让dest向后移动两步,不为0,就让dest向后移动一步
        if(arr[cur] == 0){
            dest += 2;
        }else{
            dest++;
        }
        //判断dest是否跟随cur的值"虚假复写"来到当前数组最后一位元素下标或者超过了数组的界限,是的话就停止cur和dest的移动
        if(dest >= n-1){
            break;
        }
        //来到这里就是说明dest未来到当前数组最后一位元素下标或者超过了数组的界限,让cur++,继续上面的步骤
        cur++;
    }
    //特例情况:[1,0,2,3,0,4],这种情况在虚假复写时,dest会在最后复写两次0,导致dest走到了数组边界外(正常数组下标范围定义:0 ~ n-1,n表示数组的长度,即有多少个元素),会引起报错;
    //为了处理错误,需要将n-1下标的元素改为0,再让cur向前走一步,dest向前走两步,再继续真实复写。
    if(dest == n){
        arr[n-1] = 0;
        cur -= 1;
        dest -= 2;
    }
    //真实复写:"从后向前"完成复写操作
    while(cur >= 0){
        if(arr[cur] == 0){
            arr[dest--] = 0;
            arr[dest--] = 0;
            cur--;
        }else{
            arr[dest--] = arr[cur--];
        }
    }
}
相关推荐
QXH200000几秒前
数据结构—双向链表
c语言·数据结构·算法·链表
旺小仔.19 分钟前
【数据结构篇】~排序(1)之插入排序
c语言·数据结构·算法·链表·性能优化·排序算法
绎岚科技1 小时前
深度学习自编码器 - 随机编码器和解码器篇
人工智能·深度学习·算法·机器学习
jingling5551 小时前
后端开发刷题 | 数字字符串转化成IP地址
java·开发语言·javascript·算法
云边有个稻草人1 小时前
【刷题】Day5--数字在升序数组中出现的次数
开发语言·笔记·算法
ymchuangke1 小时前
评价类——熵权法(Entropy Weight Method, EWM),完全客观评价
人工智能·python·算法·机器学习·数学建模
Crossoads2 小时前
【数据结构】排序算法---希尔排序
c语言·开发语言·数据结构·算法·排序算法
skaiuijing2 小时前
巧用二级指针
c语言·开发语言·算法·架构·操作系统
jingling5552 小时前
后端开发刷题 | 最长上升子序列
java·开发语言·数据结构·后端·算法·动态规划
YYDS3142 小时前
C++战列舰小游戏Lv. 1.4版本(半成品)
开发语言·数据库·c++·算法·游戏·游戏程序