优选算法|【双指针】|1089.复写零

目录

题目描述

题目解析

算法原理讲解

代码


题目描述

1089. 复写零

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

示例 1:

输入:arr = [1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

示例 2:

输入:arr = [1,2,3]
输出:[1,2,3]
解释:调用函数后,输入的数组将被修改为:[1,2,3]

提示:

  • 1 <= arr.length <= 104
  • 0 <= arr[i] <= 9

题目解析

        题目意思就是遇到0了再写一遍0,其他元素向右平移就行。只能在原来数组上修改,也就是空间复杂度为0.

算法原理讲解

        一般像这种在数组中移动一些数的题目,也是用双指针算法来解决这个问题。

        双指针算法是根据异地解法的操作,优化成双指针的就地操作。

异地操作

异地操作就是,重新开辟一个数组。

        定义两个指针,cur用来扫描原数组,dest用来更新新数组。

        当cur对应的值不等于0时,dest更新一个数,将cur值直接填入dest的位置,dest++,cur++就行。

        当cur对应的值等于0时,dest指针更新两个数,都填入0,cur++就行。

        当dest=arrSize就结束了。

就地操作

        就是不用重新开辟数组,也就是题目要求的那样,我们可以把cur和dest这两个指针,都放在原数组上。

       用双指针解决复写问题的步骤

1.找到最后一个复写的数

2.从后向前完成复写

        让cur指向最后一个复写的数,对于[1,0,2,3,0,4,5,0]这个数组,最后一个复写的数是4,所以让cur指向4 ,best指向最后一个位置就行。

cur指向的这个数是非零的,所以复写一次就行,复写完后,cur--,dest--。

这次cur指向0,那就复写两次,后cur--。

从图中可以看出,当cur和dest都指向-1的时候就复写完成了。

接下来有一个问题就是?——怎么找到最后一个复写的数

        还是利用双指针算法,定义两个指针cur和dest,cur用来扫描数组,dest用来标识最后一个复写的数。

cur指向的值决定dest向后移动两步还是移动一步

1.先判断cur里面的值

2.决定dest走两步还是走一步

3.在判断dest到没到结尾

4.没到结尾再cur++

        咱们一步一步来,arr[cur]现在指向了1,所以dest走一步到达下标为0的位置,dest没有走到结尾,所以cur++。

arr[cur]现在指向了0,所以dest走两步到达下标为2的位置,dest没有走到结尾所以cur++。

arr[cur]现在指向了2,所以dest走一步到达下标为3的位置,dest没有走到结尾所以cur++。

arr[cur]现在指向了3,所以dest走一步到达下标为4的位置,dest没有走到结尾所以cur++。

arr[cur]现在指向了0,所以dest走两步到达下标为6的位置,dest没有走到结尾所以cur++。

arr[cur]现在指向了4,所以dest走一步到达下标为7的位置,dest走到结尾返回cur。

        对于这个数组这种方法是刚好的,那么如果是【1,0,2,3,0,4】

arr[cur]现在指向了1,所以dest走一步到达下标为0的位置,dest没有走到结尾所以cur++。

arr[cur]现在指向了0,所以dest走两步到达下标为2的位置,dest没有走到结尾所以cur++。

arr[cur]现在指向了2,所以dest走一步到达下标为3的位置,dest没有走到结尾所以cur++。

arr[cur]现在指向了3,所以dest走一步到达下标为4的位置,dest没有走到结尾所以cur++。

         arr[cur]现在指向了0,所以dest走两步到达下标为6的位置,但是这个数组没有下标6最大直到5,所以会产生越界。

        接下来,我们怎么解决这个问题,我们要明白越界是怎么产生的,是因为复写0,复写两次就产生了越界。这个情况我们单独处理一下。

那么怎么处理呢?我们在复写的时候将最后一个位置,和越界的那个位置都复写成0。但是越界那个位置不能修改成0,我们只需要把最后一个位置修改成0(直接在这里复写),也就是arr[arrSzie-1]=0,就可以。

修改之后我们将dest向前移动两步,cur向前移动一步

cur现在就是最后一个复写的值,接下来复写就从dest现在的位置开始复写。

代码

void duplicateZeros(int* arr, int arrSize) {//找到最后一个复写的位置int cur=0;int dest=-1;while(cur<arrSize){if(arr[cur]==0)dest+=2;if(arr[cur]!=0)dest+=1;//如果dest到达最后一个位置就跳出循环//如果刚好的话是等于arrSzie-1,有越界的时候是等于arrSizeif(dest==arrSize-1||dest==arrSize)break;cur++;}//处理边界if(dest==arrSize){arr[arrSize-1]=0;cur-=1;dest-=2;}while(cur>=0&&dest>=0){if(arr[cur]==0){arr[dest--]=arr[cur];arr[dest--]=arr[cur--];}else{arr[dest--]=arr[cur--];}}}

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

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

相关文章

初学者如何快速搭建基于 Selenium Grid 的分布式自动化

Selenium Grid是一个测试工具&#xff0c;它允许我们在不同的机器上针对不同的浏览器运行测试。 配置Hub 为了简单起见&#xff0c;我们将只使用一台机器来设置Hub&#xff0c;并在同一台机器上设置Node来运行测试。 1.需要安装Java 11或更高版本 2.需要安装浏览器 3.需要…

【Python】进阶学习:pandas--isin()用法详解

【Python】进阶学习&#xff1a;pandas–isin()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅…

【简略知识】项目开发中,VO,BO,PO,DO,DTO究竟是何方妖怪?

前言 在项目开发中&#xff0c;是否需要定义VO&#xff08;视图对象&#xff09;&#xff0c;BO&#xff08;业务对象&#xff09;&#xff0c;PO&#xff08;持久化对象&#xff09;&#xff0c;DO&#xff08;领域对象&#xff09;&#xff0c;DTO&#xff08;数据传输对象&…

2.1 mov、add和sub加减指令实操体验

汇编语言 1. mov操作 1.1 mov移动值 mov指令把右边的值移动到左边 mount c d:masm c: debug r ax 0034 r 073f:0100 mov ax,7t1.2 mov移动寄存器的值 把右边寄存器的值赋值给左边的寄存器 a 073f:0105 mov bx,axt1.3 mov高八位&#xff08;high&#xff09;和低八位&am…

求职招聘类App如何打造的更卓越:解析关键功能和发展趋势

随着人才市场的竞争日益激烈&#xff0c;求职招聘类App成为现代职场中不可或缺的工具。对您来说&#xff0c;一款卓越的求职招聘类App满足您用户的多样化需求是很有必要的。在这篇文章中&#xff0c;我们将深入探讨其关键功能和行业发展趋势&#xff0c;助您的App在市场中脱颖而…

腾讯云学生服务器使用教程_申请腾讯云学生机详细流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

overleaf上传到arxiv 参考文献无法引用(?)

记一下overleaf上传到arxiv的bug 参考文献无法引用&#xff08;&#xff1f;&#xff09; 因为需要上传bbl文件而不是bib 用overleaf生成bbl 另外需要将bbl和txt的文件名设置成一样的

机器学习 | 贝叶斯优化

机器学习 | 贝叶斯优化 在科学与工程领域&#xff0c;我们经常面临着需要优化某个目标函数的挑战。这个函数可能是一个复杂的黑箱&#xff0c;难以解析或者成本高昂。举个例子&#xff0c;我们可能希望在所有可能的药物组合中找到一种新药物&#xff0c;它对某个特定人群具有最…

购买腾讯云服务器请先领取代金券,2024腾讯云优惠

腾讯云优惠代金券领取入口共三个渠道&#xff0c;腾讯云新用户和老用户均可领取8888元代金券&#xff0c;可用于云服务器等产品购买、续费和升级使用&#xff0c;阿腾云atengyun.com整理腾讯云优惠券&#xff08;代金券&#xff09;领取入口、代金券查询、优惠券兑换码使用方法…

React富文本编辑器开发(一)

这是一个系统的完整的教程&#xff0c;每一节文章的内容都很重要。这个教程学完后自己可以开发出一个相当完美的富文本编辑器了。下面就开始我们今天的内容&#xff1a; 安装 是的&#xff0c;我们的开发是基于Slate的开发基础&#xff0c;所以要安装它&#xff1a; yarn ad…

1、jQuery介绍、css()、选择器、事件、动画

一、jQuery介绍&#xff1f; 1、什么是jQuery&#xff1f; 是一个JavaScript函数库 2、jQuery特点 写的少&#xff0c;做的多 3、jQuery的安装 直接下载引入 <script src"jquery-1.10.2.min.js"></script>通过cdn引入 <script src"https…

【Memory协议栈】EEPROM Driver模块介绍

目录 前言 正文 1.功能简介 2.关键概念 3.功能详解 3.1 Job通用需求 3.2 Read作业处理 3.3 Write作业处理 3.4 Erase作业处理 3.5 Compare作业处理 4.关键API定义 4.1 Eep_Read 4.2 Eep_Write 4.3 Eep_Erase 4.5 Eep_Cancel 4.5 Eep_MainFunction 5.外部EEPRO…