【算法】活用双指针完成复写零操作

在这里插入图片描述

Problem: 1089. 复写零

文章目录

  • 题目解析
  • 算法原理分析
    • 找到最后一个复写的位置
    • 从后往前进行复写操作
  • 代码展示

题目解析

首先我们来分析一下本题的题目意思

  • 可以看到题目中给到了一个数组,意思是让我们将数组中的零元素都复写一遍,然后将其余的元素向后平移

1.jpg

  • 光就上面这样来看还是不太形象,我们通过画图来分析一下,通过下图我们可以看到,凡是0的都复写了两遍,凡不是0的都复写了一遍

2.jpg

  • 但是呢题目中很明显地讲到只能让我们在数组上进行就地操作,但是就我们上面的操作而言则是在另外开辟了一块数组的空间

那在下面我们就去考虑一下在数组原地的操作

  • 可以看到在下面我使用到了双指针的操作,若是cur遍历到0的话就进行两次的复写操作,不过呢大家可以看到在第一次的复写操作完成之后,【2】被覆盖了,但是这个【2】是我们需要的,那也就造成了一定的问题

3.jpg

💬 那么反应快的同学可以意识到,如果要进行覆盖操作的话就需要 从后往前 进行遍历操作才可以

算法原理分析

好,接下去呢我们就来分析一下解决本题的思路

找到最后一个复写的位置

  • 上面说到是要从后往前开始做复写操作,那么第一步我们所要做的就是找到最后一个复写的位置,即让这个dest指向最后的0

4.jpg

那要怎么去找呢?(头一次尝试幻灯片≧ ﹏ ≦)

可以分为以下几步:

  1. 判断cur位置的值,决定dest走一步还是两步
  2. 判断dest是否到达末尾,决定cur是否++

<图片名称1,图片名称2,图片名称3,图片名称4,图片名称5,图片名称6,图片名称7>


但是呢,就上面这样的逻辑去走的话其实是不对的,因为我们还未考虑到特殊的边界情况

  • 即下面的这种情况,当测试用例的倒数第二个数为0的时候,此时dest又刚好到这个位置,那么就需要向后移动两步,此时就造成了越界问题

12.jpg

所以此时我们应该要考虑处理一下这个边界问题

  • 因为倒数第二个数为0,那么对其进行复写操作的话,最后一个也是0,我们将其做一个修改即可,不过呢两个指针curdest也需要去做一个变化,cur前移一位即可,dest因为做了复写操作,所以需要前移两位

13.jpg

从后往前进行复写操作

上面呢,我们已经找到了需要复写的最后一个位置,那接下去我们就要正式开始复写操作了

  • 这一块的话就不做动画演示了,读者可以试着自己去手动模拟一下,也就是从我们上面所找到的cur位置开始,慢慢地向前遍历然后去做复写操作即可,将数一一地复写到dest所在的位置,如果arr[cur]为0的话,那我们就需要考虑复写两次了

14.jpg

代码展示

最后来展示一下整体的代码

class Solution {
public:void duplicateZeros(vector<int>& arr) {// 1.找到复写的最后一个位置// (1) 判断cur位置的值,决定dest走一步还是两步// (2) 判断dest是否到达末尾,决定cur是否++int dest = -1;int cur = 0;int sz = arr.size();while(dest < sz){if(arr[cur])  dest++;else   dest += 2;if(dest >= sz - 1)break;cur++;}// 2.判断边界的情况if(dest == sz){arr[dest - 1] = 0;cur--;dest -= 2;}     // 3.从右往左复写0while(cur >= 0){if(arr[cur]) arr[dest--] = arr[cur--];else{arr[dest--] = 0;arr[dest--] = 0;cur--;}}   }
};

下面是运行后的结果

15.jpg

在这里插入图片描述

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

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

相关文章

无涯教程-PHP - preg_grep()函数

preg_grep() - 语法 array preg_grep ( string $pattern, array $input [, int $flags] ); 返回由与给定模式匹配的输入数组元素组成的数组。 如果将flag设置为PREG_GREP_INVERT&#xff0c;则此函数返回输入数组中与给定模式不匹配的元素。 preg_grep() - 返回值 返回使用…

odoo安装启动遇到的问题

问题&#xff1a;在第一次加载odoo配置文件的时候&#xff0c;启动失败 方法&#xff1a; 1、先检查odoo.conf的内容&#xff0c;尤其是路径 [options] ; This is the password that allows database operations: ; admin_passwd admin db_host 127.0.0.1 db_port 5432 d…

React(8)

千锋学习视频https://www.bilibili.com/video/BV1dP4y1c7qd?p72&spm_id_frompageDriver&vd_sourcef07a5c4baae42e64ab4bebdd9f3cd1b3 1.React 路由 1.1 什么是路由&#xff1f; 路由是根据不同的 url 地址展示不同的内容或页面。 一个针对React而设计的路由解决方案…

如何使用 Docker Compose 运行 OSS Wordle 克隆

了解如何使用 Docker Compose 在五分钟内运行您自己的流行 Wordle 克隆实例。您将如何部署 Wordle&#xff1f; Wordle在 2021 年底发布后席卷了互联网。对于许多人来说&#xff0c;这仍然是一种早晨的仪式&#xff0c;与一杯咖啡和一天的开始完美搭配。作为一名 DevOps 工程师…

SQL Server 执行报错: “minus“ 附近有语法错误。

sql server 执行带 minus 的语句一直报错&#xff0c;如下图&#xff1a; 找了好久才知道minus是Oracle里面的语法&#xff0c;SQL server 应用 EXCEPT。

存储IO路径:Linux下的“快递之旅”

相信大家都有过网购的经历,当我们在电商平台上浏览心仪的商品并下单时,快递小哥会负责将物品从商家手中送至我们手中。在这个过程中,快递小哥需要经过一系列的流程才能将物品准确送达。同样,在Linux系统中,当用户下发一笔读写操作时,这些数据也需要经过一系列的流程才能最…

【面试】项目经理面试题

文章目录 一、项目管理面试中通常会问到的问题1.项目管理软件工具知识2.做项目计划的技能3.人员管理技能4.沟通技巧5.方法论知识 二、问面试官的问题三. 面试系列推荐 一、项目管理面试中通常会问到的问题 1.项目管理软件工具知识 问题 1: 工期和工作量之间的差异是什么? 答案…

Shell 编程快速入门 之 数学计算和函数基础

目录 1. 求两数之和 整数之和 浮点数之和 2. 计算1-100的和 for...in C风格for循环 while...do until...do while和until的区别 关系运算符 break与continue的区别 3. shell函数基础知识 函数定义 函数名 函数体 参数 返回值 return返回值的含义 return与…

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配)

在计算机视觉领域&#xff0c;从图像中提取和匹配特征的能力对于对象识别、图像拼接和相机定位等任务至关重要。实现这一目标的一种流行方法是 ORB&#xff08;Oriented FAST and Rotated Brief&#xff09;特征检测器和描述符。ORB 由 Ethan Rublee 等人开发&#xff0c;结合了…

基于STC15单片机-LM35-DS8B20温度测量-DS1302计时-proteus仿真-源程序

一、系统方案 本设计采用STC15单片机作为主控器。 DS18B20采集温度值送到液晶1602显示。 DS1302计时&#xff0c;日期送到液晶1602显示。 LM35采集另一路温度值送到数码管显示。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /IO初始化为…

前端console.log打印内容与后端请求返回数据不一致

后端传值num0 前端打印num1 ,如图&#xff0c;console.log后台显示的数据与展开后不一致 造成该问题原因是深拷贝与浅拷贝的问题。 var obj JSON.parse(JSON.stringify(res)) 修改后打印 正常

PostgreSQL汉字转拼音首字母

PostgreSQL汉字转拼音首字母&#xff0c;最近有个需求要做搜索优化&#xff0c;要求提取汉字首字母识别输入&#xff0c;图方便直接数据库用函数批量转换了&#xff0c;整理了网上的两个方法函数备忘&#xff0c;非原创。 https://blog.qdac.cc/?p1281 https://developer.aliy…

【0基础入门Python Web笔记】二、python 之逻辑运算和制流程语句

二、python 之逻辑运算和制流程语句 逻辑运算控制流程语句条件语句&#xff08;if语句&#xff09;循环结构&#xff08;for循环、while循环&#xff09;continue、break和pass关键字控制流程语句的嵌套以及elif 更多实战项目可进入下方官网 逻辑运算 Python提供基本的逻辑运算…

疲劳驾驶检测和识别4:C++实现疲劳驾驶检测和识别(含源码,可实时检测)

疲劳驾驶检测和识别4&#xff1a;C实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 目录 疲劳驾驶检测和识别4&#xff1a;C实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 1.疲劳驾驶检测和识别方法 2.人脸检测方法 3.疲劳驾驶识别模型(Python) &#xf…

golang 命令行 command line (flag,os,arg,args)

目录 1. golang 命令行 command line1.1. Introduction1.2. Parsing Arguments from the command line (os package)1.2.1. Get the number of args1.2.2. Iterate over all arguments 1.3. Using flags package1.3.1. Parse Typed Flags1.3.2. Set flags from the script1.3.3…

Android JNI系列详解之AS创建Native C++项目

一、前提 Android Studio版本&#xff1a;Android Studio Electric Eel | 2022.1.1 Patch 1 二、创建Native C项目 1.新建项目 2.选择新建Native C项目 3.New Project 4.选择C标准库的支持版本 5.项目自带的默认生成的代码 6.buil.gradle中也自带了CMakeList的配置&#xff08;…

【ARM64 常见汇编指令学习 20 -- ARM 指令 .include与 .asciz 详细介绍】

文章目录 .include 介绍.asciz 介绍 .include 介绍 在 ARM 汇编语言中&#xff0c;.include 命令用于插入另一个源文件的内容。它的作用类似于 C 语言中的 #include 预处理命令。这个命令通常在源文件的顶部使用&#xff0c;但也可以在任何地方使用。 语法如下&#xff1a; …

冠达管理:股票分红的钱会计算到收益吗?为什么分红之后出现亏损?

我们常说炒股的主要收益来源便是除了高抛低吸赚取差价收益之外&#xff0c;还有参加股票分红取得。那么股票分红的钱管帐算到收益吗&#xff1f;为什么分红之后呈现亏本&#xff1f;下面就由冠达管理为大家剖析&#xff1a; 股票分红的钱管帐算到收益吗&#xff1f; 不会。 股…

变频器和plc之间无线MODBUS通讯

在工业现场由PLC远程控制变频器的应用非常常见&#xff0c;如果挖沟布线不便或者变频器在移动设备上&#xff0c;那么采用无线通讯就是最佳方案。 这里我们选用最常用的三菱 FX2N PLC和三菱变频器为例&#xff0c;并结合日系plc专用无线通讯终端DTD435M来说明PLC与变频器之间的…

iOS swift 类似AirDrop的近场数据传输 MultipeerConnectivity 框架

文章目录 1.github上的demo 1.github上的demo insidegui/MultipeerDemo – github insidegui/MultipeerKit – github