[双指针](一) Leetcode 283.移动零和1089.复写零

[双指针] Leetcode 283.移动零和1089.复写零

移动零

283. 移动零

image-20231028163349090

1.题意分析

(1) 给你一个数组,将数组中的所有0移动到数组的末尾

(2) 保证非0元素在数组中相对位置不变

(3) 在原数组中操作

2.解题思路

由于题目要求我们移动数组内容(也就是交换两个数的位置),所以我们很容易想到双指针解法。

解法:双指针

定义两个“指针”(left 和 right),right遍历整个数组,遇到0就交换两个数的位置。

nums[right] == 0:right++;nums[right] != 0:swap(nums[right],    nums[left]),  right++, left++

示例1:[0, 1, 0, 3, 12]

image-20231028165935637

image-20231028165946730

请先自己尝试实现代码,再来继续往下看。


3.代码实现
class Solution {
public:void moveZeroes(vector<int>& nums) {for(int left = 0, right = 0; right < nums.size(); ){if(nums[right] != 0) swap(nums[left++], nums[right++]);else right++;}}
};

image-20231028171157270

4.总结

细节1:right的大小由我们自己在if-else控制,并不需要写入循环。

细节2:right的大小超过数组的size即为遍历完整个数组。

复习零

1089. 复写零

image-20231028171812177

1.题意分析

(1) 给你一个长度固定的数组,将数组中的0再次写一遍,即为在0后再加一个0

(2) 其余的数向右平移

(3) 超过数组长度,终止写入元素

(4) 在原数组上进行操作

2.解题思路

题目要求我们进行复写0,即需要知道两个数的位置,所以可以使用两个“指针”,一前一后:判断0,添加0。

解法:双指针

由于数组空间是固定的,我们首先需要知道最后一个数的位置,然后倒着进行修改数组。

nums[i] == 0:count+= 2;nums[i] != 0:count++;count >= nums.size-1:break;i++;

i即为新数组的最后一个数,我们在倒着写回数组。

nums[i] == 0:nums[count] = 0, count[count-1] = 0, i--, count -= 2;nums[i] != 0:nums[count] = nums[i], i--, count--。

示例1:

nums[] = [1, 0, 2, 3, 0, 4, 5, 0]

image-20231028194435626

注意处理这样的数组: nums[] = {8, 4, 5, 0, 0, 0, 0, 7}

请先自己尝试实现代码,再来继续往下看。


3.代码实现
class Solution {
public:void duplicateZeros(vector<int>& arr) {//1.计算数组最后一个位置int count = -1, i = 0, n = arr.size();while(count < n){if(arr[i] != 0) count++;else count += 2;if(count >= n-1) break;i++;}//处理特殊情况if(count == n){arr[n-1] = 0;i--;count -= 2;}//2.逆向填充数组while(i >= 0){if(arr[i] != 0) arr[count--] = arr[i--];else {arr[count--] = 0;arr[count--] = 0;i--;}}}
};

image-20231028194627831

4.总结

细节1:count为什么初始化为-1:因为数组下标是从0开始的,从-1开始可以和数组下标对应上,不会越界;从0开始最后又得减掉,后续处理十分麻烦。

细节2:求最后的复写数时,循环中if(count >= n-1) break;:如果此时count已经大过数组的size-1(也就是超出数组的范围),就没有必要再让当前的下标i再加1了。

细节3:nums[] = {8, 4, 5, 0, 0, 0, 0, 7}:这样的数组,我们最后复写出来的结果为{8, 4, 5, 0, 0, 0, 0, 0}因为第三个0,会有一个0复写时越界了,我们之前的算法无法处理这种特殊情况,需要我们手动处理一下:count == nums.size时,将数组的最后一位手动赋值0,最后复写的数的下标i应该-1,而count应该-2(看不懂就画一下图)。

END, THANKS。

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

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

相关文章

离线语音通断器开发-稳定之后顺应新需求

使用云知声的US516p6方案开发了一系列的离线语音通断器&#xff0c;目前已经取得了不小的收获&#xff0c;有1路的&#xff0c;3路的&#xff0c;4路的&#xff0c;唛头和扬声器包括唛头线材也在不断的更新打磨中找到了效果特别好的供应商。 离线语音通断器&#xff0c;家用控…

Beyond Compare比较规则设置 Beyond Compare怎么对比表格

在对文件进行比较时&#xff0c;文件夹内的文件可能存在不同类型、不同后缀名、不同内容等差异&#xff0c;这些差异会影响具体的比较结果&#xff0c;因此需要我们对软件的比较规则进行一些设置。接下来就让我们一起来学习一下Beyond Compare比较规则设置&#xff0c;Beyond C…

重构之美:Java Swing中 如何对指定行文本进行CSS样式渲染,三种实现思路分享

文章目录 需求分析Document 应用彩蛋 需求分析 在Swing中&#xff0c;如果期望实现对JTextArea 或者 TextPane等文本区域实现单行渲染改怎么做&#xff1f;如上图所示 总的来说有两种实现方案 文本行数可控&#xff0c;那么构造一组JLabel集合按表单顺序添加&#xff0c;这样可…

松下A6B伺服 马达不动问题解决

本人在用信捷XDH plc ethercat总线&#xff0c;连松下A6B伺服&#xff0c;轴配置完成轴调试时&#xff0c;出现能使能&#xff0c;但 马达不动的情况。 开始总怀疑时信捷PLC的原因&#xff0c;后面查明是输入口定义引起的。 用USB线连接伺服&#xff0c;打开PANAPARM软件,自…

在Mac上安装MongoDB 5.0

MongoDB 5.0安装 1、环境描述 操作系统&#xff1a;macOS 14.0 (23A344) 2、安装MongoDB 2.1、tar解压包安装 下载地址&#xff1a;Download MongoDB Community Server | MongoDB 创建一个目录&#xff0c;以便数据库将文件放入其中。&#xff08;默认情况下&#xff0c;数据…

linux--

一、crond 任务调度 1、原理示意图 2、crontab 进行定时任务的设置 2.1. 概述 任务调度&#xff0c;是指系统在某个时间执行的特定的命令或程序。任务调度分类&#xff1a; 系统工作: 有些重要的工作必须周而复始地执行。如病毒扫描等 个别用户工作:个别用户可能希望执行某些…

深度学习:张量 介绍

张量[1]是向量和矩阵到 n 维的推广。了解它们如何相互作用是机器学习的基础。 简介 虽然张量看起来是复杂的对象&#xff0c;但它们可以理解为向量和矩阵的集合。理解向量和矩阵对于理解张量至关重要。 向量是元素的一维列表&#xff1a; 矩阵是向量的二维列表&#xff1a; 下标…

Ajax学习笔记第三天

做决定之前仔细考虑&#xff0c;一旦作了决定就要勇往直前、坚持到底&#xff01; 【1 ikunGG邮箱注册】 整个流程展示&#xff1a; 1.文件目录 2.页面效果展示及代码 mysql数据库中的初始表 2.1 主页 09.html:里面代码部分解释 display: inline-block; 让块元素h1变成行内…

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示

pytorch笔记:TRIPLETMARGINLOSS

1 介绍 创建一个衡量三元组损失的标准&#xff0c;给定输入张量 x1​、x2​ 和 x3​ 以及一个大于0的间距值。这用于测量样本之间的相对相似性。一个三元组由a、p和n组成&#xff08;锚点、正例和负例&#xff09;。所有输入张量的形状都应为 (N,D) 2 基本使用方法 torch.nn.…

AD9371 官方例程HDL详解之JESD204B RX侧格式配置

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 采样率和各个时钟之间的关系 &#xff1a; AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 &#xff08;三&#xff09; 参考资料&#xff1a; UltraScale Architecture G…

【AD9361 数字接口CMOS LVDSSPI】D 串行数据之SPI

【AD9361 数字接口CMOS &LVDS&SPI】D部分 接续 【AD9361 数字接口CMOS &LVDS&SPI】A 并行数据之CMOS 串行外设接口&#xff08;SPI&#xff09; SPI总线为AD9361的所有数字控制提供机制。每个SPI寄存器的宽度为8位&#xff0c;每个寄存器包含控制位、状态监视…

【OpenCV实现平滑图像金字塔,轮廓:入门】

文章目录 概要图像金字塔轮廓&#xff1a;入门 概要 文章内容的概要&#xff1a; 平滑图像金字塔&#xff1a; 图像金字塔是什么&#xff1f; 图像金字塔是指将原始图像按照不同的分辨率进行多次缩小&#xff08;下采样&#xff09;得到的一系列图像。这种处理方式常用于图像…

数据链路层和DNS之间的那些事~

数据链路层&#xff0c;考虑的是两个节点之间的传输。这里面的典型协议也很多&#xff0c;最知名的就是“以太网”。我们本篇主要介绍的就是以太网协议。这个协议规定了数据链路层&#xff0c;也规定了物理层的内容。 目录 以太网帧格式 帧头 载荷 帧尾 DNS 从输入URL到…

[读论文] On Joint Learning for Solving Placement and Routing in Chip Design

0. Abstract 由于 GPU 在加速计算方面的优势和对人类专家的依赖较少&#xff0c;机器学习已成为解决布局和布线问题的新兴工具&#xff0c;这是现代芯片设计流程中的两个关键步骤。它仍处于早期阶段&#xff0c;存在一些基本问题&#xff1a;可扩展性、奖励设计和端到端学习范…

获取IEEE会议论文的标题和摘要

获取IEEE会议论文的标题和摘要 – 潘登同学的爬虫笔记 文章目录 获取IEEE会议论文的标题和摘要 -- 潘登同学的爬虫笔记 打开IEEE的高级搜索环境准备完整爬虫过程获取文章地址翻译函数获取文章标题和摘要 前几天接到导师的一个任务&#xff0c;要我去找找IEEE Transactions on K…

vue源码分析(七)—— createComponent

文章目录 前言一、createComponent 参数说明二、createComponent 源码详解1.baseCtor的实际指向2.extend 方法3.判断Ctor是否是函数的判断4.installComponentHooks方法5.返回一个带标识的组件 vnode 前言 createComponent文件的路径&#xff1a; src\core\vdom\create-componen…

【Qt之控件QKeySequenceEdit】分析及使用

描述 QKeySequenceEdit小部件允许输入一个QKeySequence。 该小部件允许用户选择一个QKeySequence&#xff0c;通常用作快捷键。当小部件获取焦点时&#xff0c;录制将开始&#xff0c;并在用户释放最后一个键后的一秒钟结束。 用户可以使用输入键盘来输入键序列。通过调用get…

Postman日常操作

一.Postman介绍 1.1第一个简单的demo 路特斯&#xff08;英国汽车品牌&#xff09;_百度百科 (baidu.com) 1.2 cookie 用postman测试需要登录权限的接口时&#xff0c;会被拦截&#xff0c;解决办法就是每次请求接口前&#xff0c;先执行登录&#xff0c;然后记住cookie或者to…

python html(文件/url/html字符串)转pdf

安装库 pip install pdfkit第二步 下载程序wkhtmltopdf https://wkhtmltopdf.org/downloads.html 下载7z压缩包 解压即可, 无需安装 解压后结构应该是这样, 我喜欢放在项目里, 相对路径引用(也可以使用绝对路径, 放其他地方) import pdfkit# 将 wkhtmltopdf.exe程序 路径 p…