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

复写零原题地址

方法一:双指针法

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

如:对于数组[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个,需要去掉最后一个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只需要复写1次,其余情况正常复写即可。复写时,把[0,i]的元素按照是否为0进行分类,非零元素复写1次,零复写2次。

// 方法一:双指针
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个0导致栈中元素比数组多if (top == n + 1){arr[j--] = 0;--i;}// while(j>=0)也可以,但是第一个位置是否复写没有区别while (j > 0){arr[j--] = arr[i];if (arr[i] == 0){arr[j--] = 0;}--i;}}
};

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

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

相关文章

新零售的升维体验,摸索华为云GaussDB如何实现数据赋能

新零售商业模式 商业模式通常是由客户价值、企业资源和能力、盈利方式三个方面构成。其最主要的用途是为实现客户价值最大化。 商业模式通过把能使企业运行的内外各要素整合起来&#xff0c;从而形成一个完整的、高效率的、具有独特核心竞争力的运行系统&#xff0c;并通过最…

Windows显示空的可移动磁盘的解决方案

123  大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式…

VCG 网格蝶分算法(MidPointButterfly)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 网格蝶分(Butterfly Subdivision)算法是一种用于三角网格细分的方法。它是一种局部细分方法,即它通过对每个三角形进行细分来生成更多的顶点和三角形,而不是全局地对整个网格进行操作。这种方法得名于它将每个三…

开发板和单片机的比较

Arduino 和单片机在功能和使用上有一些区别&#xff0c;因此哪个更好用取决于具体的需求和场景。 Arduino 开发板是一种基于开源硬件和软件的微控制器平台&#xff0c;通过简化和标准化的方式使电子开发变得更加容易。Arduino 具有易于 编程、丰富的输入输出功能、可扩展性、开…

寒武纪显卡实现高维向量的softmax并行优化

关于寒武纪编程可以参考本人之前的文章添加链接描述&#xff0c;添加链接描述&#xff0c;添加链接描述 高维向量softmax的基础编程 高维向量的softmax实现更加复杂&#xff0c;回忆之前在英伟达平台上实现高维向量的softmax函数&#xff0c;比如说我们以形状为[1,2,3,4,5,6]…

Unity_ShaderGraph节点问题

Unity_ShaderGraph节点问题 Unity版本&#xff1a;Unity2023.1.19 为什么在Unity2023.1.19的Shader Graph中找不见PBR Master节点&#xff1f; 以下这个PBR Maste从何而来&#xff1f;

工大智信智能听诊器的云数据服务

工大智信智能听诊器的云数据服务---医疗数据安全的新保障 核心关键词&#xff1a;安全的云数据服务、医疗数据保护 在医疗数据管理中&#xff0c;数据的安全性和保密性至关重要。 工大智信智能听诊器通过其安全的云数据服务&#xff0c;确保所有患者数据的安全存储和传输。 这种…

linux下 Make 和 Makefile构建你的项目

Make 和 Makefile构建你的项目 介绍 在软件开发中&#xff0c;构建项目是一个必不可少的步骤。make 是一个强大的自动化构建工具&#xff0c;而 Makefile 是 make 工具使用的配置文件&#xff0c;用于描述项目的构建规则和依赖关系。本篇博客将介绍 make 和 Makefile 的基本概…

Java中SQL注入的防范与解决方法

Java中SQL注入的防范与解决方法 什么是SQL注入&#xff1f; SQL注入是一种常见的安全漏洞&#xff0c;攻击者通过在应用程序的输入中插入恶意的SQL代码&#xff0c;从而破坏、绕过或者利用数据库系统的安全机制。这可能导致数据泄露、数据损坏或者其他恶意行为。 在Java应用…

【成品论文】2024美赛B题完整成品论文23页+3小问matlab代码+数据集汇总

2024 年美国大学生数学建模竞赛&#xff08;2024 美赛&#xff09;B 题&#xff1a; 2024 MCM 问题 B: 搜寻潜水艇 题目翻译&#xff1a; Maritime Cruises Mini-Submarines (MCMS)是一家总部位于希腊的公司&#xff0c;专门制造能够携 带人类到达海洋最深处的潜水艇。潜水艇是…

【Kubernetes】在k8s1.24及以上版本基于containerd容器运行时测试pod从harbor拉取镜像

基于containerd容器运行时测试pod从harbor拉取镜像 1、安装高版本containerd2、安装docker3、登录harbor上传镜像4、从harbor拉取镜像 1、安装高版本containerd 集群中各个节点都要操作 yum remove containerd.io -y yum install containerd.io-1.6.22* -y cd /etc/containe…

SpringBoot实战第三天

今天主要完成了&#xff1a; 新增棋子分类 棋子分类列表 获取棋子分类详情 更新棋子分类 更新棋子分类和添加棋子分类_分组校验 新增棋子 新增棋子参数校验 棋子分类列表查询(条件分页) 先给出分类实体类 Data public class Category {private Integer id;//主键IDNot…

[UI5 常用控件] 06.Splitter,ResponsiveSplitter

文章目录 前言1. Splitter1.1 属性 2. ResponsiveSplitter 前言 本章节记录常用控件Splitter,ResponsiveSplitter。主要功能是分割画面布局。 其路径分别是&#xff1a; sap.ui.layout.Splittersap.ui.layout.ResponsiveSplitter 1. Splitter 1.1 属性 orientation &#x…

【QT+QGIS跨平台编译】之二十八:【Protobuf+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、Protobuf介绍二、文件下载三、文件分析四、pro文件4.1 libprotobuf4.2 libprotobuf-lite4.3 libprotoc4.4 protocApp五、编译实践一、Protobuf介绍 Protocol Buffers(简称 Protobuf)是由 Google 开发的一种数据序列化协议,就像 XML 或 JSON 一样,但是它更小、…

DevOps落地笔记-17|度量指标:寻找真正的好指标?

前面几个课时端到端地介绍了软件开发全生命周期中涉及的最佳实践&#xff0c;经过上面几个步骤&#xff0c;企业在进行 DevOps 转型时技术方面的问题解决了&#xff0c;这个时候我们还缺些什么呢&#xff1f;事实上很多团队和组织在实施 DevOps 时都专注于技术&#xff0c;而忽…

【Linux网络编程三】Udp套接字编程(简易版服务器)

【Linux网络编程三】Udp套接字编程(简易版服务器&#xff09; 一.创建套接字二.绑定网络信息1.构建通信类型2.填充网络信息①网络字节序的port②string类型的ip地址 3.最终绑定 三.读收消息1.服务器端接收消息recvfrom2.服务器端发送消息sendto3.客户端端发送消息sendto4.客户端…

TCP 了解

参考&#xff1a;4.2 TCP 重传、滑动窗口、流量控制、拥塞控制 | 小林coding TCP报文 其中比较重要的字段有&#xff1a;&#xff08;1&#xff09;序号&#xff08;sequence number&#xff09;&#xff1a;Seq序号&#xff0c;占32位&#xff0c;用来标识从TCP源端向目的端发…

利用IP地址精准定位服务

在数字化时代&#xff0c;IP地址已成为连接我们与网络世界的纽带之一。通过IP地址&#xff0c;我们可以追踪用户的位置信息&#xff0c;实现精准定位服务。本文将探讨如何利用IP地址精准定位服务&#xff0c;为个人和企业带来便利和价值。 一、什么是IP地址精准定位服务&#…

JDK、JRE、JVM三者关系详解

java开发工具包 java运行环境 java开发工具 Java 运行环境 Java虚拟机 java核心类库 JDK是java开发工具包&#xff0c;包含了编写、编译、运行、调试java程序所需的所有工具和组件。它拥有JRE所拥有的一切&#xff0c;还有编译器和工具&#xff0c;能够创建和编译程序。 …

【FPGA】高云FPGA之IP核的使用->PLL锁相环

FPGA开发流程 1、设计定义2、设计输入3、分析和综合4、功能仿真5、布局布线6、时序仿真7、IO分配以及配置文件&#xff08;bit流文件&#xff09;的生成8、配置&#xff08;烧录&#xff09;FPGA9、在线调试 1、设计定义 使用高云内置IP核实现多路不同时钟输出 输入时钟50M由晶…