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

news2024/9/28 17:29:15

复写零

链接: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--];
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1980692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享一个基于微信小程序的旅游自助拼团系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

想业余时间做个网赚项目,有啥捷径?

前两年我陷入一段迷茫、浮躁、焦虑期。 主要原因是&#xff0c;心很大&#xff0c;力不足。 总想着找到一个高利润、高复购、少竞争的“蓝海”产品。 于是就面临一个尴尬的境地&#xff1a;普通业务看不上&#xff0c;蓝海业务找不着。 而且总想着做推广一步登天&#xff0…

程序员日志之DNF手游女鬼剑前瞻

目录 传送门正文日志1、概要女鬼剑 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#xff08;精品&#xff09; MyBatis框架&#xff08;精品&#xff09; MyBatis-Plus SpringDataJPA SpringClou…

【教资 · 科目一】综合素质

【科目一】综合素质 单选题&#xff1a;29道/2分&#xff0c;共58分材料分析题&#xff1a;3道/14分&#xff0c;共42分写作题&#xff1a;1道&#xff0c;50分 卷面满分150分 —— 报告满分120分 及格分数99分以上 —— 及格分数70分 ‍ 考试内容&#xff1a; 职业理念&a…

Flink笔记整理(七)

Flink笔记整理&#xff08;七&#xff09; 文章目录 Flink笔记整理&#xff08;七&#xff09;九、容错机制9.1 检查点&#xff08;Checkpoint&#xff09;检查点的保存从检查点恢复状态检查点算法9.2 状态一致性9.3 端到端精确一次&#xff08;End-To-End Exactly-Once&#x…

中科亿海微SoM模组——光纤陀螺控制板

光纤陀螺控制板 光纤陀螺仪是一种高精度、高可靠性的惯性测量仪器&#xff0c;被广泛应用于导航、姿态控制等应用场景&#xff0c;具有非常重要的应用价值。 本文介绍的光纤陀螺控制板是基于中科亿海微自研的SiP芯片平台&#xff0c;以及光纤陀螺数字信号处理流程&#xff0c…

安泰高压功率放大器的作用以及应用有哪些

高压功率放大器是一种用于增强信号强度的电子设备。它的作用是将输入信号的功率放大到足够的水平&#xff0c;以便在系统中进行传输或执行特定的任务。高压功率放大器在各种领域都有广泛的应用&#xff0c;从通信到科学研究再到医疗设备等多个领域都可以找到其身影。 高压功率放…

echarts横向柱状图

一、效果图 二、代码 let option {grid: {top: 8%,bottom: -20,right: 20,left: 20,containLabel: true},xAxis: {show: false},yAxis: [{triggerEvent: true,show: true,inverse: true,data: getArrByKey(data, name),axisLine: {show: false},splitLine: {show: false},axi…

React(五):XLS、XLSX文件在线预览

效果 依赖 $ yarn add xlsx源码 .xlsx-wrap {position: relative;width: 100%;height: 100%;background-color: #fafafa;.ant-tabs {width: 100%;height: 100%;.ant-tabs-nav {height: 50px;padding: 0 10px;margin-bottom: 0;}.ant-tabs-content-holder {border-top: 1px so…

JavaScript对象转数组的三种简单方法

大家好&#xff01;今天我们要聊的是JavaScript中一个非常实用的技巧——将对象转换为数组。 方法1&#xff1a;使用Object.keys()和Array.map() 首先介绍一种基础但非常实用的方法&#xff0c;就是通过Object.keys()获取对象的键&#xff0c;然后用Array.map()把这些键对应的值…

C++ primer plus 第17 章 输入、输出和文件:文件输入和输出01

C primer plus 第17 章 输入、输出和文件&#xff1a;文件输入和输出01 C primer plus 第17 章 输入、输出和文件&#xff1a;文件输入和输出01 文章目录 C primer plus 第17 章 输入、输出和文件&#xff1a;文件输入和输出0117.4 文件输入和输出17.4.1 简单的文件 1/0程序清…

商家转账到零钱分销返佣申请方案及驳回处理办法

分销返佣场景是商家申请最多的场景&#xff0c;因而申请被驳回也是最多的&#xff0c;根据我们上万次成功开通商家转账到零钱的经验&#xff0c;当商家转账到零钱的分销返佣场景被驳回时&#xff0c;按照以下步骤&#xff0c;商家都可以快速过审&#xff1a; 一、分析驳回原因 …

C Primer Plus 第6章——第一篇

你该逆袭了 第6章:重点摘录 零、本章内容介绍一、while 循环1、程序注释&#xff08;1&#xff09;伪代码 2、C 风格读取循环 二、while 语句1、终止 while 循环2、语法要点 三、用 关系运算符 和 表达式 比较大小1、fabs( ) 函数 比较 浮点数(1) fabs( ) 函数 2、什么是 真&am…

世界人口过亿的一级行政区分布

世界国人口已经突破80亿&#xff0c;人口过亿的国家也有14个&#xff0c;分别是中国、俄罗斯、巴西、墨西哥&#xff0c;美国、日本、印度、巴基斯坦、印度尼西亚、尼日利亚、孟加拉国、埃塞俄比亚、菲律宾、埃及。 那么作为国家的一级行政区人口过亿的区域有那些呢?这里就来…

返璞归真:通过简化用例来简化用户界面01

Larry Constantine 著harvey 译 我们常被问及精简那些最简化、抽象和通用窗体用例的重要性。到底有多重要呢&#xff1f;在以用户为 中心的设计中&#xff0c;简化那些重要窗体的用例是获得成功的关键。它能够为开发者设计优秀的用户界面 助一臂之力。通过消除不必要的或技术驱…

书籍推荐-给数字化、PLM制造从业同行推荐的几本书

基础入门和提升的书籍&#xff1a; 1.《制造企业的产品数据管理--原理、概念、策略》&#xff0c;作者&#xff1a;[德]约瑟夫萧塔纳著&#xff0c;祁国宁译 这是一本很基础&#xff0c;但是也非常经典的企业实施PDM管理价值和方法的书籍&#xff0c;大概出版于2001年&#x…

@Component 注解高端玩法【策略模式】

优质博文&#xff1a;IT-BLOG-CN 在Spring框架中&#xff0c;Component注解本身并不支持直接通过注解参数来定义一个key值。不过&#xff0c;你可以通过自定义注解和Qualifier注解来实现类似的功能。 以下是一个示例&#xff0c;展示如何通过自定义注解和Qualifier来实现将不同…

芯片行业ERP相比于传统ERP到底有什么区别

在数字化发展时代&#xff0c;ERP系统已成为企业管理和运营的重要工具。然而&#xff0c;在高度正规化的芯片行业中&#xff0c;传统ERP系统往往难以满足其独特的业务需求。本文将带大家一起来探讨芯片行业ERP与传统ERP之间的主要区别。 1. 专业化与定制化需求 芯片行业ERP系统…

【教资 · 科目二】教育知识与能力

【教资 科目二】教育知识与能力 官网&#xff1a;https://ntce.neea.edu.cn/ ‍ 题型 教育学&#xff1a;1、2、3、7、8&#xff08;前&#xff09; 心理学&#xff1a;4、5、6、8&#xff08;后&#xff09; ​ ​ 黄色&#xff1a;重点 蓝色&#xff1a;次重点 灰色…

C++商店管理系统

代码中使用了C11的特性 后面有些输出(cout输出的)的提示文本是英文&#xff0c;因为懒得敲中文 源码在最后面 文末投票参与一下谢谢 商品数据保存在 items.txt 用户数据保存在 users.txt 实现功能 1.添加商品&#xff08;商品ID,商品名&#xff0c;库存数量&#xff0c;价格&a…