【C++】双指针算法:复写零

news2024/9/27 12:17:10

1.题目

别看这是一道简单题,它的通过率低于一些中等甚至困难的题目!

大大增加这道题目难度的是最后一句话:1.不可越界写入。2.就地修改。

如果可以再创建一个数组的话,那么这道题目就会非常简单,但这道题目必须要求在原数组上修改就需要注意很多细节!

2.算法思路

同样,我们需要两个指针:cur和dest。

cur负责遍历数组,判断所读取的元素是0还是非0。

dest负责修改数据。

现在两个指针分工明确,就需要确定是从左往右遍历数组还是从右往左遍历数组。

举个例子:arr={1,0,2,3};

先试试从左往右遍历数组:

cur读取第一个元素是非0,dest对数组不做处理。

cur读取第二个元素是0,dest将第二个,第三个元素修改成0。此时数组变成:arr={1,0,0,3};从这一步开始,后面就全错了!因为第三个元素被改成0了,cur已经读读不到原来的数据了,结果就是dest将后面的数据全部改成零!

看来只能从右往左遍历数组:

这次举题目中示例一的例子:arr={1,0,2,3,0,4,5,0};

从这个例子中结果,我们发现cur指针最多遍历到元素4就不会往后遍历了,如果我们先确定cur读取的最后一个数据的位置,让cur从那个位置从后往前遍历,让dest从后往前修改就不会出现0把原来还没读取的数据覆盖的情况。

但这种方法需要考虑一个边界情况:如果数组是arr={1,0,2,3,0,4};

修改后的结果就是arr={1,0,0,2,3,0};要特别注意dest从后往前修改数组时,最后一个0只写了一遍!把这个边界情况解决后就可以完成这道题目啦!

3.提交结果和代码

提交结果:

代码:

这个代码是我第一次写这道题目时写的代码,并不是最精简的,读起来有些费劲,我在后面给出了简化版的

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int size=arr.size(),cur=0,dest=-1;
        //用cur找到数组需要复写的最后一个数
        while(1){
            if(size==0)
                break;
            if(arr[cur]){
                dest++;
                if(dest<size-1)
                    cur++;
                else
                    break;
            }
            else{
                dest+=2;
                if(dest<size-1)
                    cur++;
                else
                    break;
            }
        }
        if(dest==size){ //处理边界情况
            arr[--dest]=arr[cur--];
            dest--;
        }
        while(cur>=0){ //dest前置--和后置--尽量不要混合使用,否则很可能在数组同一个位置会写入两次,或有的位置会漏写
            if(arr[cur]==0){
                arr[dest--]=0;
                arr[dest--]=0;
                cur--;
            }
            else{
                arr[dest--]=arr[cur--];
            }
            
        }
    }
};

 这是简化后的代码,结果更清晰一些:

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int size=arr.size(),cur=0,dest=-1;
        //用cur找到数组需要复写的最后一个数
        while(cur<size){
            if(arr[cur]) dest++;
            else dest+=2;
            if(dest>=size-1) break;
            cur++;    
        }
        if(dest==size){ //处理边界情况
            arr[dest-1]=arr[cur];
            dest-=2;cur--;
        }
        while(cur>=0){ //dest前置--和后置--尽量不要混合使用,否则很可能在数组同一个位置会写入两次,或有的位置会漏写
            if(arr[cur]==0){
                arr[dest--]=0;
                arr[dest--]=0;
                cur--;
            }
            else arr[dest--]=arr[cur--];
        }
    }
};

时间复杂度分析:

大约遍历了两次数组,时间复杂度:O(n)。

空间复杂度分析:

定义了三个变量,空间复杂度:O(1)。

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

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

相关文章

汽车IVI中控开发入门及进阶(十六):carplay认证

现在有些中控采用高通的芯片如8155、8295等,实现多屏互动等,但是也有一些车型走低成本方案,比如能够实现HiCar、CarLife或者苹果Apple的Carplay等能进行手机投屏就好了。 能实现CarPlay功能通过Carplay认证,也就成了一些必须的过程,国产车规级中控芯片里,开阳有一款ARK1…

AI视频分析技术的常用开源模型及TSINGSEE青犀AI视频识别分析能力介绍

AI视频分析技术是指利用人工智能技术来对视频数据进行分析和处理的技术。开源模型是指可以免费获取和使用的代码模型&#xff0c;可以帮助开发人员快速构建和部署AI视频分析应用程序。 以下是一些业内常用的用于AI视频分析技术的开源模型&#xff1a; OpenCV&#xff1a;Open…

kali搭建vulfocus靶场

电脑安装kali&#xff0c;使用kali搭建靶场&#xff0c;自己电脑作为VPS使用 kali 先装好docker: # docker version # 查看当前是否有docker&#xff0c;如果无docker &#xff0c;则进行docker安装 # apt install docker.io 安装完成后&#xff0c;再次输入 # docker…

【数据结构】二叉树链式结构的实现《遍历,实现》(题库+解析+源码)

前言 二叉树的学习离不开对堆的理解&#xff0c;这是上篇堆的传送门 http://t.csdnimg.cn/F6Jp3 1.二叉树链式结构的实现 1.1 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在大家对二 叉树结构掌握还…

【Java】常见锁策略 CAS机制 锁优化策略

前言 在本文会详细介绍各种锁策略、CAS机制以及锁优化策略 不仅仅局限于Java&#xff0c;任何和锁相关的话题&#xff0c;都可能会涉及到下面的内容。 这些特性主要是给锁的实现者来参考的. 普通的程序猿也需要了解一些, 对于合理的使用锁也是有很大帮助的 文章目录 前言✍一、…

收集统计信息报错ora-00600[16515]问题处理

1、基础环境 操作系统Oracle Solaris 11.3 数据版本Oracle 12.2 2、故障理像 对一个20T的大库收集一下全库的统计信息 原因是现在都2024年了&#xff0c;这个库的统计信息基本都是2021年&#xff0c; 没具体查找啥原因导致的系统自定义的收集任务失败&#xff0c;于是决定手…

2024年内外贸一体化融合发展(长沙)交易会

2024年内外贸一体化融合发展&#xff08;长沙&#xff09;交易会 一、总体思路 充分发挥湖南作为全国内外贸一体化试点地区作用&#xff0c;坚持“政府主导、市场驱动、企业为主”的原则&#xff0c;以“助力双循环&#xff0c;拓展新市场&#xff0c;促进新消费”为主题&…

腾讯云服务器价格明细表2024年最新(CPU内存/带宽/磁盘)

腾讯云服务器价格明细表2024年最新&#xff08;CPU内存/带宽/磁盘&#xff09;腾讯云服务器租用优惠价格表&#xff1a;轻量应用服务器2核2G3M价格61元一年&#xff0c;2核2G4M价格99元一年、135元15个月、540元三年&#xff0c;2核4G5M带宽165元一年、252元15个月、756元3年&a…

VBA运行后,为什么excel的三个工作表结果一样?

运行完了excel的三个工作表的结果一样&#xff0c;问题在哪呢&#xff1f; 代码如下&#xff1a; Sub 计算成绩() 计算成绩 Macro i为工作表行号 Dim i, m, total As Integer Dim w1 As Worksheet For m 1 To Worksheets.count Set w1 Worksheets(m) i 2 total 0 …

【MySQL 数据宝典】【磁盘结构】- 002 数据字典

一、数据字典 ( Data Dictionary ) 1.1 背景介绍 我们平时使用 INSERT 语句向表中插入的那些记录称之为用户数据&#xff0c;MySQL只是作为一个软件来为我们来保管这 些数据&#xff0c;提供方便的增删改查接口而已。但是每当我们向一个表中插入一条记录的时候&#xff0c;MyS…

ZISUOJ 数据结构--队列及其应用

说明&#xff1a; 基本都是bfs的常见模板题型&#xff0c;思路都很直接&#xff0c;不过后面有两道题很搞心态&#xff0c;它们给的坐标x、y是反的&#xff0c;导致刚开始一直错。题目还是要看仔细&#xff0c;不能先入为主。 题目列表&#xff1a; 问题 A: 围圈报数(完善程序…

Python实现对波士顿房价的分析与预测

文章目录 问题分析所需环境代码实现1. 相关性分析及可视化2. 房价分析及可视化3. 构建房价预测模型问题分析 波士顿房价数据集包含美国人口普查局收集的美国马萨诸塞州波士顿住房价格的有关信息, 数据集很小,只有506个案例。 数据集都有以下14个属性,具体含义如下 现在需要…

工业控制(ICS)---组态软件分析

组态软件 什么是组态软件&#xff1f; 组态软件就是一些数据采集与过程控制的专用软件&#xff0c;它们是在自动控制系统监控层一级的软件平台和开发环境&#xff0c;使用灵活的组态方式&#xff0c;为用户提供快速构建工业自动控制系统监控功能的通用层次的软件工具。 组态软…

轮转数组(Leedcode)的题目

题目&#xff1a;给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步…

恶心透了的小日子,害人终害己,国货呼吁关注抵制日本核废水排放

​|日本排放核废水 日本政府决定将福岛第一核电站的核污染水经过处理后排放入海&#xff0c;这一决定引发了多方面的担忧和反对&#xff0c;特别是在周边国家&#xff0c;包括中国和韩国。关于日本排放核污染水这一新闻事件&#xff0c;我们必须首先认识到&#xff0c;核能利用…

二百三十三、Flume——Flume采集JSON文件到Kafka,再用Flume采集Kafka数据到HDFS中

一、目的 由于使用了新的Kafka协议&#xff0c;因为根据新的协议推送模拟数据到Kafka中&#xff0c;再Flume采集Kafka数据到HDFS中 二、技术选型 &#xff08;一&#xff09;Kettle工具 准备使用Kettle的JSON input控件和Kafka producer控件&#xff0c;但是搞了1天没搞定&…

《自动机理论、语言和计算导论》阅读笔记:p261-p314

《自动机理论、语言和计算导论》学习第 10 天&#xff0c;p261-p314总结&#xff0c;总计 48 页。 一、技术总结 1.generating & reachable 2.Chomsky Normal Form(CNF) 乔姆斯基范式。 3.pumping lemma 泵作用引理。引理&#xff1a;引理是数学中为了取得某个更好的…

基于docker搭建瀚高数据库HighGo6.0.1【图文】

基于docker搭建瀚高数据库HighGo6.0.1 拉取镜像启动验证进入容器 登录数据库查看数据库加密方式修改加密方式为sm3进入数据库修改密码重启容器 数据库验证数据库密码到期参考 docker部署 https://blog.csdn.net/weixin_44385419/article/details/127738868 拉取镜像 docker p…

【ARM Trace32(劳特巴赫) 使用介绍 12.1 -- Trace32 读写 64位地址】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 读写 64位地址读 64 位地址写64位地址Trace32 读写 64位地址 在使用TRACE32进行调试时,有时需要读取或操作64位的地址,特别是在处理64位的处理器或操作系统时。以下是如何在TRACE32中读取64位地址的一般方法。 读 64 位地…

数据可视化(八):Pandas时间序列——动态绘图,重采样,自相关图,偏相关图等高级操作

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…