LeetCode每日一题之 复写0

目录

题目介绍:

算法原理:

特殊位置处理:

代码实现:


题目介绍:

题目链接:. - 力扣(LeetCode)

算法原理:

这种对数组元素进行修改,移动的题目我们仍然可以使用双指针法,不过我们按照常规思路从左到右处理数组,不难发现如下这种问题:

当cur指向1时,让dest下一个元素复写cur指向的元素,并让dest和cur++,当cur指向0的时候, 让dest后两个元素复写0,并让cur++,dest+=2。按照这种常规思路,模拟运行几步就会发现问题:

当cur指向第一个0时,会让后面的2被0复写,这样就会导致未处理的数就会被覆盖 。那么如何解决这个问题呢?

当双指针算法可能会覆盖未处理数据时,我们不妨倒着来遍历数组,假设我们两根指针都已找到了结束位置(如何找到等会会讲)

 此时,我们再像刚才那样:

若cur指向的元素不为0,则让dest指向的元素复写cur指向的元素,再cur--,dest--,若cur指向的元素为0,则让dest指向的元素复写0,再dest--,继续让dest指向的元素复写0,最后让dest--,cur--。

这样之后确实能像我们预想一样处理完数组,那么现在最重要的问题来了,就是,如何让两个指针找到结束位置。其实很简单,只要把上面讲的常规思路稍作修改,只移动指针,不复写数据,当dest走到数组末尾的时候结束:

初始位置如下:

当cur找到非0时,dest++,cur++。

当cur找到0时,dest+=2,cur++。

当dest走到数组末尾时结束。 

这样走完后,我们的两个指针就会走到对应结束的位置。

特殊位置处理:

上面的算法看似完美,实则还有一个特殊情况没处理,当执行如下案例时:

在找结束位置算法中,两个指针走到如上图所示的位置时,此时cur指向0,dest走两个位置后

可以发现dest越界了,我们再像之前讲的那样复写时,会出现越界访问,所以要特殊处理一下:

  当cur 和 dest 找到结束位置后,判断dest是否等于n(数组元素个数),若等于则是出现了这种情况,我们就用一个if 自己控制第一步复写,然后再让复写算法用循环走剩下的,第一步复写:先--dest,再让dest指向的元素复写cur指向的元素,再dest--,cur--,第一步复写后指针位置如图:

代码实现:

void duplicateZeros(int* arr, int arrSize) {int dest =-1;int cur =0;int n =arrSize;//找到结束位置while(dest<n-1){if(arr[cur]==0){dest+=2;}else{dest++;}if(dest<n-1){cur++;}}//特殊位置处理if(dest==n){dest--;arr[dest]=arr[cur];dest--;cur--;}//开始从后往前进行复写while(cur>=0){if(arr[cur]==0){arr[dest]=0;--dest;arr[dest]=0;--dest;}else{arr[dest]=arr[cur];--dest;}cur--;}
}

 

 

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

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

相关文章

Unity之街机捕鱼

目录 &#x1f62a;炮台系统 &#x1f3b6;炮口方向跟随鼠标 &#x1f3b6;切换炮台 &#x1f62a;战斗系统 &#x1f3ae;概述 &#x1f3ae;单例模式 &#x1f3ae;开炮 &#x1f3ae;子弹脚本 &#x1f3ae;渔网脚本 &#x1f3ae;鱼属性信息的脚本 &#x1f6…

【探索AI】二十一 深度学习之第4周:循环神经网络(RNN)与长短时记忆(LSTM)

循环神经网络&#xff08;RNN&#xff09;与长短时记忆&#xff08;LSTM&#xff09; RNN的基本原理与结构LSTM的原理与实现序列建模与文本生成任务实践&#xff1a;使用RNN或LSTM进行文本分类或生成任务步骤 1: 数据准备步骤 2: 构建模型步骤 3: 定义损失函数和优化器步骤 4: …

【系统架构设计师考试大纲】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱考试目标考试要求考试题目题型分析计算机基础知识&#xff08;20%&#xff09;信息化战略与规划&#xff08;9%&#xff09;软件工程&#xff08;25%&#xff09;系统架构设计&#xff08;35%&#xff09;信…

视觉基本数据和基线代码获取

机器视觉相关网站推荐 - 知乎 1. 搜benchmark, 视觉相关的&#xff0c;任何一个行业&#xff0c;只要是一个大众的&#xff0c;都有自己的benchmark. 一般都会有自己的数据集和相应的代码。很多benchmark都会帮我们搜集优秀的代码和数据集。 http://shuoyang1213.me/WIDERFA…

Linux 驱动 中断(一)

中断是指计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的程序并转入处理新情况的程序&#xff0c;处理完毕后又返回原被暂停的程序继续运行。 在 Linux 中&#xff0c;中断处理是操作系统与硬件设备之间通信的重要方式之一。Li…

FT4222模块树莓派使用

关于FT4222设备 FT4222是一款功能强大的USB到SPI/I2C/GPIO的转接器桥&#xff0c;由芯片制造商FTDI&#xff08;Future Technology Devices International Ltd.&#xff09;开发和生产。该模块可以将USB接口转换为SPI&#xff0c;I2C接口或GPIO接口&#xff0c;从而方便地连接…

Fantasy UI

有了这个包&#xff0c;你可以获得一个完整的幻想rpg游戏ui的psd源文件。 下载&#xff1a;​​Unity资源商店链接资源下载链接 效果图&#xff1a;

阿里云创建的SpringBoot项目打包时找不到主清单属性

原因是因为maven配置文件中有一个打包属性配置 <configuration><mainClass>com.yang.ExamSystemApplication</mainClass><!-- 找到这个<skip>true</skip>标签关闭&#xff0c;或者属性改为false --><skip>true</skip> </c…

40个Python字符串实例

Python 字符串是 Python 编程语言中最常用的数据类型之一&#xff0c;它可以表示文本或一组字符。Python 中的字符串是不可变的序列&#xff0c;意味着一旦创建&#xff0c;其值就不能被修改。下面是一些关于 Python 字符串的介绍。 概述 创建字符串&#xff1a;可以使用单引…

通过zabbix监控docker宿主机

通过Zabbix监控Docker主机及其容器&#xff0c;您可以利用Zabbix Agent2的内置功能来收集和报告Docker容器的相关指标。以下是基本步骤概要&#xff1a; 安装与配置Zabbix Agent2&#xff1a; 在Docker主机上安装Zabbix Agent2。确保Agent2能够访问Docker守护进程&#xff0c;并…

Tomcat常见配置(基础功能、虚拟主机、搭建博客)

目录 一、Tomcat基础功能 1、自动解压war包 2、Tomcat工具界面 2.1 Server Status (服务器状态) 2.1.1 本地登录状态页 2.1.2 远程登录状态页 2.2 Manager App (管理应用程序) 2.3 Host Manager (主机管理器) 3、Context 配置 二、配置虚拟主机 三、搭建 JPress 博客…

如何处理微服务之间的通信和数据一致性?

✨✨祝屏幕前的兄弟姐妹们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、微服务通信 1、同步通信&#xff1a;HTTP 1.1.同步通信示例代码&#xf…