lettcode 1089. 复写零

代码:

class Solution {public void duplicateZeros(int[] arr) {int cur = 0, dest = -1, n = arr.length;// 1. 先找到最后⼀个需要复写的数while (cur < n) {if (arr[cur] == 0) dest += 2;else dest += 1;if (dest >= n - 1) break;cur++;}// 2. 处理⼀下边界情况if (dest == n) {arr[n - 1] = 0;cur--;dest -= 2;}// 3. 从后向前完成复写操作while (cur >= 0) {if (arr[cur] != 0) arr[dest--] = arr[cur--];else {arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
}

题解:

        我们可以定义两个指针,一个指针 cur 用来遍历数组,另一个指针 dest 用来复写元素到数组中

        对于示例 1 如果我们采用从左到右的方式来复写元素:

       cur     cur

        1        0        2        3        0        4        5        0

        1        0        0

      dest    dest

        当 cur 指向 1 时,将 dest 指向的位置设为 1,然后 cur 和 dest 都向右移,当 cur 指向 0 时,将 dest 指向的位置和下一个位置都设为 0 ,此时我们就会发现问题,源数组中的 2 还没有写就被覆盖了

        所以采取从左到右的方式是错误的,我们应该使用从右到左的方式

                                               cur     cur

        1        0        2        3        0        4        5        0

                                                          0        0         4

                                                        dest    dest    dest

        让 cur 指向最后一个复写的数,从右到左依次遍历复写,这样就不会出现覆盖的情况


        那么现在我们面临的问题就是如何让 cur 去指向最后一个复写的数

        我们采用以下的逻辑,模拟复写的过程,让 cur == 0,dest == -1,当 cur 指向的数不为 0 时,dest 就 ++,当cur 指向的数为 0 时 dest  就+= 2,直到 dest >= arr.length - 1 为止

               cur     cur                                   cur

                1        0        2        3        0        4        5        0

   dest    dest                                                                dest

        我们通过上述流程便能让 cur 指向最后一个复写的数,并且 dest 刚好在数组的末尾,可以直接根据当前的位置进行从右到左的复写


        我们要是只考虑上述的情况写出来的代码是有 bug 的

        比如现在有一个例子:        1.0.2.0.3.0.5.0

        我们正确复写的结果应该是 1,0,0.2.0.0.3.0

        但通过我们上述的方法进行分析:

                                                 cur     cur

          1        0        2        0        3        0        5        0

          1        0        0        2        0        0        3        0        0

                                                                     dest            dest

        我们发现,当最后一个复写的数为 0 时,采用从右到左的方式复写可能会多出一个 0 

        所以我们要对这种特殊情况进行判断,当查找最后一个复写的数时 dest == arr.length ,就说明此时最后一个复写的数为 0,并且最终结果会多次一个 0 ,我们需要对特殊情况进行处理,将

arr[arr.length-1] = 0,cur-- ,dest -= 2

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

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

相关文章

智能优化算法应用:基于多元宇宙算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于多元宇宙算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于多元宇宙算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.多元宇宙算法4.实验参数设定5.算法结果6.参考…

函数版 → 求小于给定整数的最大素数 ← Python

【题目描述】 求小于给定整数的最大素数。【算法分析】 ● 求n以内的最大素数&#xff0c;实现技巧之一是从n-1开始判断其是否为素数&#xff0c;这样可以提升算法效率。 ● 在Python中实现由x至1的递减操作&#xff0c;需要使用 range(x,1,-1)。注意其中的-1。● 在Python中&a…

激光器温度,波长变化

940&#xff0c;波长变化0.3nm/C

linux 驱动——原子操作

文章目录 linux驱动——原子操作原子操作 API原子位操作 API原子操作驱动原子操作 APP linux驱动——原子操作 原子操作 API Linux 内核定义了叫做 atomic_t 的结构体来完成整型数据的原操作&#xff0c;在使用是使用原子变量来代替整型变量。此结构体定义在 include/linux/t…

LeetCode Hot100 226.翻转二叉树

题目&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 递归&#xff1a;深度优先遍历 迭代&#xff1a;广度优先遍历 方法&#xff1a;迭代 class Solution {public TreeNode invertTree(TreeNode root) {if (root null…

深度学习早停机制(Early Stopping)与早退机制(Early exiting)

早停机制&#xff0c;一种机器学习模型调优策略&#xff0c;提升调优效率 下图损失值明显经过了欠拟合到过拟合 使用早停机制后&#xff0c;模型不再过拟合 模型早停是面向模型训练过程的。而在模型内部&#xff0c;也会出现类似的现象&#xff0c;这一现象被叫做过度思考(Ove…

SAP 调用OO类发送邮件测试(可发送表格和附件)

原文链接&#xff1a;https://blog.csdn.net/sapliumeng/article/details/134152739 在SAP实施中&#xff0c;邮件发送功能在很多项目都会用到&#xff0c;而且往往是把内表以Excel或者CSV的格式发送附件&#xff0c;最好是这个表格也可以显示在正文中&#xff0c;这样的话如果…

Linux中执行java命令报错:cannot execute binary file: Exec format error

网上很多文章 都是说操作系统和JDK&#xff0c;32位和64位不兼容问题 当你非常确定你的操作系统是64位&#xff0c;并且JDK也是64位的时候 或者非常确定你的操作系统是32位&#xff0c;并且JDK也是32位的时候 怎么办&#xff1f; 使用以下命令&#xff0c;查看你的操作系统…

华为的数字化转型(9)——企业架构4A集成模型

企业架构&#xff08;Enterprise Architecture&#xff0c;EA&#xff09;是衔接战略与项目实施的桥梁&#xff0c;引入企业架构方法&#xff0c;可以对数字化转型愿景进行系统性的、分层分级的梳理和解释&#xff0c;以便企业上下在同一张蓝图上统一认识。 企业架构提供了整体…

Druid数据库连接池框架

1.Druid概述 Druid 是一个开源的数据库连接池框架&#xff0c;用于管理和优化数据库连接的使用。它提供了高效的、可扩展的连接池管理&#xff0c;可以用于 Java 应用程序连接到关系型数据库。 之前有了解过 C3P0 数据库连接池&#xff0c;所谓数据库连接池就是重复利用连接数据…

接口文档自动生成工具:详细教程和实用技巧

本篇文章详细教你如何使用 Apifox 的 IDEA 插件实现自动生成接口代码。好处简单总结有以下几点&#xff1a; 自动生成接口文档&#xff1a; 不用手写&#xff0c;一键点击就可以自动 生成文档&#xff0c;当有更新时&#xff0c;点击一下就可以自动同步接口文档&#xff1b;代…

影响PPC广告成本预算的因素,如何计算亚马逊PPC广告预算——站斧浏览器

亚马逊PPC&#xff0c;又称按点击付费(Pay Per Click)&#xff0c;是一种只有用户点击你的广告时才会向你收费的模式。那么影响PPC广告成本预算的因素,如何计算亚马逊PPC广告预算&#xff1f; 影响PPC广告成本预算的因素 1、产品类别&#xff1a;不同类别的产品竞争程度不同&…

性能优化的一般策略及方法

性能优化的一般策略及方法 在汽车嵌入式开发领域&#xff0c;性能优化始终是一个无法回避的问题&#xff1a; 座舱 HMI 想要实现更流畅的人机交互 通信中间件在给定的 CPU 资源下&#xff0c;追求更高的吞吐量 更一般的场景&#xff1a;嵌入式设备 CPU 资源告急&#xff0c;需…

前端将blob转换为可下载的url及下载

一.转换 //将blob转换为url const changeBlobToUrl blobData > {return new Promise(resolve > {//创建Blob对象const blob new Blob([blobData])// 创建FileReader对象const reader new FileReader()reader.onload function (e) {resolve(e.target.result)}// 使用F…

Gin投票系统(2)

投票系统 数据库的建立 先分析需求&#xff0c;在sql中建立数据库&#xff0c;关于项目数据库如何建立可以在“goweb项目创建流程分析中看如何去建表” 成功后目前有四个表&#xff1a; vote&#xff0c;user&#xff0c;vote_opt,vote_opt_user 建立数据库&#xff0c;可以…

ERRO报错

无法下载nginx 如下解决&#xff1a; 查看是否有epel 源 安装epel源 安装第三方 yum -y install epel-release.noarch NGINX端口被占用 解决&#xff1a; 编译安装的NGINX配置文件在/usr/local/ngin/conf 修改端口

2024年天津艺术职业学院专升本报名工作的通知

天津艺术职业学院关于2024年天津市高职升本科考试报名工作的通知 请天津艺术职业学院各位2024届大专应届毕业生&#xff08;含高职扩招2024年应届毕业生&#xff09;查阅以下通知。 一、网上报名 &#xff08;一&#xff09;时间及网址&#xff1a;请于2023年12月4日9:00至6日…

【面经八股】搜广推方向:常见面试题(六)

【面经&八股】搜广推方向:常见面试题(六) 文章目录 【面经&八股】搜广推方向:常见面试题(六)1. Memorization 和 Generalization2. Wide 和 Deep3. Cross-product transformation4. 推荐系统划分5. 线性模型6. Embedding-Based 模型7. 推荐系统工作流程8. Wide P…

DM8误删除操作恢复方案

达梦数据库三种在误删除操作后的回退方案 一、闪回表 当用户操作不慎导致错误的删改数据时&#xff0c;闪回方式可以恢复数据。闪回技术&#xff0c;就是为了用户可以迅速处理这种 数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原…

C语言:编程实现1!+2!+3!+4!+……+n!

分析&#xff1a; #include<stdio.h>//这是一个预处理指令&#xff0c;将stdio.h头文件包含到程序中&#xff0c;以便使用输入输出函数。 int main()//这是程序的主函数&#xff0c;是程序执行的入口点。 int i, a 1, t 0, n;//定义了整型变量i、a、t和n。其中&#x…