【力扣】复写零,栈 + 双指针法

复写零原题地址

方法一:双指针法

从前向后复写,会造成覆盖。所以,应该从后向前复写,这样我们可以考虑维护一个栈。遍历数组,如果遇到非零元素,就入栈一次;如果遇到零,就入栈两次。当栈中的元素个数超出数组的元素个数时,把栈中的元素重新从后向前写入数组即可

如:对于数组 [1 2 0 0 3 0 4] ,

1 :入栈 1 次: [1]

2 :入栈 1 次: [1 2]

0 :入栈 2 次: [1 2 0 0]

0 :入栈 2 次: [1 2 0 0 0 0]

3 :入栈 1 次: [1 2 0 0 0 0 3]

此时栈中元素个数和数组元素个数相等,重新写入数组即可。

再举一个例子,对于数组 [1 2 0 0 3 0 4 5]

1 :入栈 1 次: [1]

2 :入栈 1 次: [1 2]

0 :入栈 2 次: [1 2 0 0]

0 :入栈 2 次: [1 2 0 0 0 0]

3 :入栈 1 次: [1 2 0 0 0 0 3]

0 :入栈 2 次: [1 2 0 0 0 0 3 0 0]

此时栈中元素个数比数组元素个数多一个,需要去掉最后一个零,把 [1 2 0 0 0 0 3 0] 写入数组。

由于不允许开辟 O(N) 的额外空间,我们可以考虑用 top 来维护栈顶(即栈中的有效数据个数),模拟出入栈过程。假设数组长度为 n ,当 top<n 时,可以继续入栈

用下标 i 来记录要复写的元素,下标 j 来记录复写的目标位置。在前面模拟入栈的过程中,可以记录最后一个入栈的元素在数组中的下标,即 i 。由于是从后向前复写, j 要初始化为 n-1 。

对于栈中元素个数比数组元素个数多一个,即 top==n+1 的特殊情况,最后一个零只需要复写一次,其余情况正常复写即可。复写时,把 [0,i] 的元素按照是否为零进行分类,非零元素复写一次,零复写两次。

// 方法一:双指针
class Solution
{
public:void duplicateZeros(vector<int>& arr){int n = arr.size();int top = 0; // 记录栈顶int i = -1;// 模拟把数组元素放入栈中while (top < n){if (arr[++i]){++top;}else{top += 2;}}// i 表示要复写的数据// j 表示要复写的位置int j = n - 1;// 最后放入 2 个零导致栈中元素比数组多if (top == n + 1){arr[j--] = 0;--i;}while (j > 0){// 第一次复写arr[j--] = arr[i];// 零还需要复写第二次if (arr[i--] == 0){arr[j--] = 0;}}}
};

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

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

相关文章

玉米基因miRNA结合位点预测工具

前记 目前&#xff0c;已经有很多种玉米miRNA结合位点预测工具可供选择&#xff0c;以下几种比较常用&#xff1a; 1、psRNATarget&#xff1a;该工具是由华盛顿州立大学开发的&#xff0c;可以用来预测植物miRNA和靶基因之间的相互作用。用户可以使用该工具来预测玉米miRNA和结…

Linux cp命令文档(cp指令)(cp --help)(各选项参数用法解释)

文章目录 cp命令文档英文中文 关键点示例-x, --one-file-system&#xff08;保持在此文件系统上&#xff0c;不做跨域文件系统拷贝&#xff09;含义示例 疑问什么是“长选项的强制参数对短选项也是强制的”&#xff1f;什么是“稀疏文件”&#xff1f; cp命令文档 英文 rootu…

【5G NR】移动通讯中使用的信道编解码技术

目录 一、引言 二、信道编解码技术概述 三、移动通讯中常用的信道编解码技术 四、优缺点分析与比较 五、未来发展趋势 六、结论 本文主要介绍了移动通讯中采用的信道编解码技术&#xff0c;由于在5G NR终端中&#xff0c;通常要兼容4G LTE通讯技术&#xff0c;所以4G LTE…

论文摘要和总结在某种程度上有相似之处,但它们在内容和目的上有所不同

论文摘要和总结在某种程度上有相似之处&#xff0c;但它们在内容和目的上有所不同。 1. **摘要 (Abstract)**: - 摘要通常位于论文开头&#xff0c;是对整篇论文的简要概述&#xff0c;其主要目的是向读者提供论文的核心内容、研究方法、主要结果和结论&#xff0c;以及研究…

【GAMES101】Lecture 19 相机

目录 相机 视场 Field of View (FOV) 曝光&#xff08;Exposure&#xff09; 感光度&#xff08;ISO&#xff09; 光圈 快门 相机 成像可以通过我们之前学过的光栅化成像和光线追踪成像来渲染合成&#xff0c;也可以用相机拍摄成像 今天就来学习一下相机是如何成像的…

【服务器数据恢复】服务器RAID模块硬件损坏的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某品牌服务器中有一组由数块SAS硬盘组建的RAID5磁盘阵列&#xff0c;服务器操作系统是WINDOWS SERVER&#xff0c;服务器中存放企业数据&#xff0c;无数据库文件。 服务器出故障之前出现过几次意外断电的情况&#xff0c;服务器断电…

从零开始学howtoheap:理解fastbins的double-free攻击

how2heap是由shellphish团队制作的堆利用教程&#xff0c;介绍了多种堆利用技术&#xff0c;后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境&#xff1a;优化pwn虚拟机配置支持libc等指令-CSDN博客 1.fastbins的double-free攻击 下面的程序展示了fast…

JavaScript基础第六天

JavaScript 基础第六天 今天我们学习数组的遍历&#xff0c;以及数组的其他用法。 1. 数组遍历 1.1. 古老方法 可以使用 for 循环进行遍历。 let arr ["a", "b", "d", "g"]; for (let i 0; i < arr.length; i) {console.log…

形态学算法应用之连通分量提取的python实现——图像处理

原理 连通分量提取是图像处理和计算机视觉中的一项基本任务&#xff0c;旨在识别图像中所有连通区域&#xff0c;并将它们作为独立对象处理。在二值图像中&#xff0c;连通分量通常指的是所有连接在一起的前景像素集合。这里的“连接”可以根据四连通或八连通的邻接关系来定义…

C语言中的多级指针、指针数组与数组指针

在C语言中&#xff0c;指针是一个非常重要的概念&#xff0c;它为我们提供了直接操作内存地址的能力。通过指针&#xff0c;我们可以访问和修改内存中的数据&#xff0c;实现各种灵活的操作。本文将通过示例代码和详细解释&#xff0c;深入探讨C语言中的多级指针、指针数组和数…

话题:IT行业有哪些证书含金量高?

IT行业有哪些证书含金量高? 1. 以下是一些在IT行业中我认为具有高含金量的证书&#xff1a; 思科认证&#xff08;Cisco Certifications&#xff09;&#xff1a;思科认证是由网络领域的著名厂商——Cisco公司推出的&#xff0c;是互联网领域的国际权威认证。这个认证体系包含…

ICLR 2024 | Harvard FairSeg:第一个研究分割算法公平性的大型医疗分割数据集

近年来&#xff0c;人工智能模型的公平性问题受到了越来越多的关注&#xff0c;尤其是在医学领域&#xff0c;因为医学模型的公平性对人们的健康和生命至关重要。高质量的医学公平性数据集对促进公平学习研究非常必要。现有的医学公平性数据集都是针对分类任务的&#xff0c;而…

openssl3.2 - exp - buffer to BIO

文章目录 openssl3.2 - exp - buffer to BIO概述笔记END openssl3.2 - exp - buffer to BIO 概述 openssl的资料看的差不多了, 准备将工程中用到的知识点整理一下. openssl中很多API是以操作文件作为输入的, 也有很多API是以BIO作为输入的. 不管文件是不是受保护的, 如果有可…

VUE学习——事件处理

事件分为内联事件和方法事件。 我们可以使用【v-on】&#xff08;简写&#xff1a;&#xff09;来处理。 内联 <button v-on:click"count">按钮</button><button click"count">按钮</button><p>{{ count }}</p>方法

新年新展望

去年其实是收获颇丰的一年&#xff0c;除了工作中各项工作都得到了很大的推进&#xff0c;个人生活中也有很多变化&#xff0c;其中还拿到了功能安全工程师的证书&#xff0c;以及功能安全经理的证书。 展望一下2024年准备输出的内容&#xff0c;一个是对ISO26262的解读&#x…

【力扣】回文数,反转一半数字 + 字符串

回文数原题地址 方法一&#xff1a;反转一半数字 考虑特殊情况&#xff1a; 负数不是回文数&#xff0c;如 -123 &#xff0c;反过来为 321- 。个位数为零的非零数不是回文数&#xff0c;比如 120 &#xff0c;反过来为 021 。 对于一般情况&#xff0c;我们只需要取出后半…

容器基础:Docker 镜像如何保证部署的一致性?

Docker 镜像如何通过固化基础环境、固化依赖性和固化软件启动流程保证部署的一致性 Docker 镜像通过以下三个方面保证部署的一致性&#xff1a; 1. 固化基础环境: 镜像包含构建应用程序所需的所有环境依赖项&#xff0c;例如操作系统、库和工具。构建镜像时&#xff0c;所有…

Rust语言入门(第3篇)

引用与借用 上一篇中&#xff0c;我们介绍了rust的所有权概念&#xff0c;若直接传递变量做函数参数&#xff0c;堆上的变量就会失去所有权&#xff0c;而栈上变量则由于复制&#xff0c;仍有所有权。 fn main(){let b 3;makes_copy(b);println!("after using a variab…

STM32之USART

概述 串口通信&#xff0c;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter &#xff09;&#xff0c;简称UART&#xff1b;而USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff09;通用同步收发传输器。 USAR…

python学习笔记 -- 字符串

目录 一、输出字符串的格式 二、字符串的一些函数 1、len函数&#xff1a;字符串长度 2、查找字符所在位置index 3、某字符在字符串中的个数count 4、字符切片 对字符串进行翻转 -- 利用步长 5、修改大小写字母&#xff1a; 6、判断开头和结尾 7、拆分字符串 一、输出…