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

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++;elsebreak;}else{dest+=2;if(dest<size-1)cur++;elsebreak;}}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.mzph.cn/diannao/1880.shtml

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

相关文章

Linux的学习之路:18、进程间通信(2)

摘要 本章主要是说一下命名管道和共享内存 目录 摘要 一、命名管道 1、创建一个命名管道 2、匿名管道与命名管道的区别 3、命名管道的打开规则 4、代码实现 二、system V共享内存 1、共享内存 2、共享内存函数 三、代码 四、思维导图 一、命名管道 1、创建一个命…

13.Nacos简介,下载,安装,启动-windows

Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud的一个组件。 相比Eureka功能更加丰富&#xff0c;服务注册与发现和分布式配置。 Nacos下载地址&#xff1a; https://github.com/alibaba/nacos windows下载nacos-server-1.4.1.zip文件 nacos是基于java语言实现的&…

【系统架构师】-案例考点(三)

1、信息系统架构ISA设计 四种架构模型&#xff1a; 1&#xff09;单机应用 2&#xff09;客户机/服务器模式&#xff1a;两层、三层C/S、B/S模型、MVC模式等 3&#xff09;面向服务架构SOA 4&#xff09;企业数据交换总线&#xff1a;不同企业应用之间通过信息交换的公共频…

2024-04-21 问AI: 介绍一下花卉数据集Oxford 102 flowers

文心一言 Oxford 102 flowers数据集是一个由牛津大学工程科学系于2008年发布的花卉图像分类数据集。该数据集主要用于图像分类任务&#xff0c;并涵盖了英国常见的102种花卉&#xff0c;每种花卉由40到258张图像组成。这些图像涵盖了较大的比例、姿势和光线变化&#xff0c;使…

opengauss pending启动转主备代码分析

opengauss以pending启动时&#xff0c;也会执行StartupXLOG&#xff0c;并且replay wal&#xff0c;ApplyRedoRecord()会被调用。 当对pending状态的gaussdb&#xff0c;执行gs_ctl notify -M primary 时&#xff0c;会启动walsender等线程。 gs_ctl与gaussdb之间的交互不是通…

一招下载transformers真不用网上那些教程(我试了1*mol多次才知道)

pip很多是2 然而&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…

element中file-upload组件的提示‘按delete键可删除’,怎么去掉

问题描述 element中file-upload组件会出现这种提示‘按delete键可删除’ 解决方案&#xff1a; 这是因为使用file-upload组件时自带的提示会盖住上传的文件名&#xff0c;修改一下自带的样式即可 ::v-deep .el-upload-list__item.is-success.focusing .el-icon-close-tip {d…

洛谷 -P1007 独木桥(模拟,思维)

独木桥 题目背景 战争已经进入到紧要时间。你是运输小队长&#xff0c;正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激&#xff0c;于是命令你的士兵们到前方的一座独木桥上欣赏风景&#xff0c;而你留在桥下欣赏士兵们。士兵们十分愤怒&#xf…

angular17 打包项目放在了多出了个browser目录

修改package.json配置文件&#xff0c;把 "builder": "angular-devkit/build-angular:application", 改成"builder": "angular-devkit/build-angular:browser", 把"browser": "src/main.ts",改成"main&qu…

排队分红,你想象不到的电商新玩法

亲爱的朋友们&#xff0c;我是微三云的周丽&#xff0c;一名专注于私域电商模式创新的探索者。 随着互联网的迅猛发展&#xff0c;电商行业的商业模式也在不断演变。最近&#xff0c;一种全新的消费返利模式——排队分红模式&#xff0c;成为了业界瞩目的焦点。这一模式结合了…

组合模式【结构型模式C++】

1.概述 组合模式又叫部分整体模式属于结构型模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。 2.结构 组件&#xff08;Component&#xff09;:定义了组合中所有对象的通用接口&#xff0c…

three.js(3):添加three. js坐标轴、光源和阴影效果

1 实现步骤 要实现阴影效果同样需要几个重要的概念。 我们首先研究一下日常生活中是如何产生阴影效果的。 需要有光。需要一个物体&#xff0c;比如苹果、狗等。需要一个接受投影的元素&#xff0c;比如地面、桌面等。 在 Three.js 中要产生阴影效果其实和现实世界的原理差…

python:使用scipy及numpy对三维空间点进行插值并可视化

用scipy及numpy对三维空间点进行插值并可视化 示例 1示例 2示例 3 示例 1 要在Python中对三维坐标空间点进行插值&#xff0c;可以使用SciPy库中的插值函数。首先&#xff0c;需要安装SciPy库。可以使用以下命令来安装&#xff1a; pip install scipy接下来&#xff0c;可以使…

mysql 5.7分组报错问题 Expression #1 of ORDER BY clause is not in GROUP BY clause

解决方案&#xff1a; select version(), sql_mode;SET sql_mode(SELECT REPLACE(sql_mode,ONLY_FULL_GROUP_BY,)); 完美的解决方案是&#xff1a; 1 show variables like "sql_mode"; 2 3 set sql_mode; 4 set sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABL…

在Debian上可以部署哪些有用的服务?

2024年4月20日&#xff0c;周六下午 在 Debian 上可以部署许多有用的服务&#xff0c;以满足各种需求。 以下是一些常见的有用服务&#xff1a; Web 服务器&#xff1a;如 Apache、Nginx、Lighttpd 等&#xff0c;用于托管网站和 Web 应用。数据库服务器&#xff1a;如 MySQL…

java面向对象.day26(抽象类)

说明&#xff1a; Java抽象类是一种特殊的类&#xff0c;它不能被直接实例化&#xff0c;只能作为其他类的基类&#xff08;即超类或父类&#xff09;。抽象类的主要作用是定义一组公共的行为和属性&#xff0c;这些行为和属性可以由其子类共享和继承。 1. 定义抽象类 抽象类…

分布式与一致性协议之拜占庭将军问题(一)

拜占庭将军问题 概述 拜占庭将军问题其实是借拜占庭将军故事展现了分布式共识问题&#xff0c;探讨和论证了解决的办法。实际上&#xff0c;拜占庭将军问题是分布式领域最复杂的一个容错模型&#xff0c;一旦搞懂了它&#xff0c;久能掌握分布式共识问题的解决思路&#xff0…

Oracle21C 引入HR实例(linux)

1、下载资源 https://github.com/oracle-samples/db-sample-schemas点击code&#xff08;代码&#xff09;下载 2、上传Sql文件 解压之后将human_resources里的文件复制到demo\schema\目录&#xff08;具体目录前面的路径是你安装的路径&#xff09;下&#xff0c;如下图 3、…

【LLM】LLM API 开发

文章目录 LLM API 开发LLM入门基本概念LLM API使用实名认证创建应用使用API Prompt Engineering思考总结 参考文章 什么是提示工程&#xff08;Prompt Engineering&#xff09;&#xff1f; ChatGPT Prompt 最佳指南一 LLM API 开发 LLM入门基本概念 Prompt Prompt 最初是 NL…

TFTLCD原理硬件介绍

介绍 TFT LCD&#xff08;薄膜晶体管液晶显示器&#xff09;是一种广泛使用的显示技术&#xff0c;它结合了薄膜晶体管&#xff08;TFT&#xff09;和液晶显示&#xff08;LCD&#xff09;技术。TFT LCD的主要特点是使用TFT矩阵来控制施加到每个像素的电压&#xff0c;从而实现…