Java【手撕双指针】LeetCode 1089. “复写零“, 图文详解思路分析 + 代码

文章目录

  • 前言
  • 一、复写零
    • 1, 题目
    • 2, 思路分析
      • 2.1, 从左往右 or 从右往左
      • 2.2, 找到最后一个保留的数
    • 3, 代码展示


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

一、复写零

1, 题目

OJ链接

注意, 本题要求原地操作, 不能开辟额外数组空间 ! !

「数组分两块」是⾮常常⻅的⼀种题型,主要就是根据⼀种划分⽅式,将数组的内容分成左右两部分。这种类型的题,⼀般就是使⽤「双指针」来解决


2, 思路分析

2.1, 从左往右 or 从右往左

上篇文章 介绍了 “移动零”, 底层思路和本题类似, 都是利用双指针来划分数组, "移动零"中双指针是从左往右遍历的, 这也是一般的尝试解法, 但本题不能从左往右遍历

先来尝试从左往右遍历 :

  • 定义第一个指针 cur(当前) , 用来遍历数组, 判定当前数据为零还是非零
  • 定义第二个指针 dest(目的地), 开始时和 cur 同步
  • 如果 cur 指向零, 则继续遍历
  • 如果 cur 指向非零, 则 dest 指向的值修改成 0 , dest++(执行两次)

过程如图 :
在这里插入图片描述

双指针具体是从左往右还是从右往左遍历, 根据实际情况判断, 本题中只能使用从右往左了
如果题目不要求原地复写, 我们可以开辟一个同样大小的数组, 在新数组上执行上述操作, 就不会有覆盖数据的现象了


首先从结果导向分析一下 :

原数组 : [1,0,2,3,0,4,5,0] ----> 复写后输出:[1,0,0,2,3,0,0,4], 说明 : 4 之后的数据都被删除了, 所以复写过程中, 这个 4 是最后一个被保留的数

  • 定义第一个指针 cur(当前) , 开始时指向4(原数组的 5 下标), 用来遍历数组, 判定当前数据为零还是非零
  • 定义第二个指针 dest(目的地), 开始时指向数组最后一个数据
  • 如果 cur 指向零, 则 dest 指向的值修改成 0 , dest-- (执行两次)
  • 如果 cur 指向非零, 则 dest 指向的值修改成 cur 指向的值

dest 的意思是目的地, 在从右往左遍历时, 目的地是 0 下标, 这正是 while 循环条件

过程如图 :
在这里插入图片描述

结果符合预期


2.2, 找到最后一个保留的数

上述例子中的 cur 的初始位置是 数组中最后一个保留的数, 我们用肉眼找到了 4, 那如何用代码找到 cur 的初始位置呢 ? 也是利用双指针, 从左往右遍历

  • cur 和 dest 初始化为 -1 下标, 从左往右遍历

  • 如果 cur 指向零, 则 dest++ 两次

  • 如果 cur 指向非零, 则 dest++ 一次

  • 当 dest 走到数组末尾时, cur 就是最后一个保留的数

所以正确的步骤是 : 1, 先找最后一个保留的数 2, 复写操作

但需注意 ! ! !

当原数为 : [1,5,2,0,6,8,0,6,0], 最后一个保留的数是零, 由于 cur 指向零, 需要 dest++ 两次, 那么循环结束后, dest 不是在数组末尾, 而是越界了一个单位 ! ! !

需要对 dest 单独判断, 如果 dest 越界, 不能再 [dest] = 0, 而是直接 [dest - 1] - 0


3, 代码展示

	public void duplicateZeros(int[] arr) {// 1, 先找到最后一个需要复写的数int dest = -1;int cur = -1;while(dest < arr.length - 1) {cur++;if(arr[cur] != 0) {dest++;}if(arr[cur] == 0) {dest += 2;}}// 2, 从右往左复写while(dest >= 0 ) {if(arr[cur] != 0) {arr[dest] = arr[cur];dest--;}else {// 判断 dest 是否越界if(dest == arr.length) {arr[dest - 1] = 0;}else {arr[dest] = 0;arr[dest - 1] = 0;}dest -= 2;}cur--;}}   

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

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

相关文章

【SpringCloud】Gateway使用

文章目录 概述阻塞式处理模型和非阻塞处理模型概念阻塞式处理模型 三大核心概念 工作流程使用POMYML启动类配置路由通过编码进行配置动态路由常用的Route Predicate自定义全局过滤器自定义filter 官网 https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1…

Swift 周报 第三十五期

文章目录 前言新闻和社区五天市值蒸发 2000 亿美元&#xff0c;苹果公司怎么了&#xff1f;在你的 App 中帮助顾客解决账单问题需要声明原因的 API 列表现已推出 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十五…

【李宏毅机器学习】注意力机制

输出 我们会遇到不同的任务&#xff0c;针对输出的不一样&#xff0c;我们对任务进行划分 给多少输出多少 给一堆向量&#xff0c;输出一个label&#xff0c;比如说情感分析 还有一种任务是由机器决定的要输出多少个label&#xff0c;seq2seq的任务就是这种&#xff0c;翻译也…

FPGA_学习_17_IP核_ROM(无延迟-立即输出)

由于项目中关于厂商提供的温度-偏压曲线数据已经被同事放在ROM表了&#xff0c;我这边可用直接调用。 今天在仿真的时候&#xff0c;发现他的ROM表用的IP核是及时输出的&#xff0c;就是你地址给进去&#xff0c;对应地址的ROM数据就立马输出&#xff0c;没有延迟。 我打开他的…

Android开发基础知识总结(一)初识安卓Android Studio

一.基础理论知识 1.Linux相当于是地基。 MIUI&#xff0c;EMUI等操作系统&#xff0c;是基于安卓的改版——且裁掉了一部分Google的服务。 &#xff08;鸿蒙虽然是改版&#xff0c;但和安卓的架构基本上一致&#xff09; 2.Kotlin和Java都是JVM语言&#xff0c;必须先复习好…

【三维重建】【深度学习】NeuS代码Pytorch实现--测试阶段代码解析(下)

【三维重建】【深度学习】NeuS代码Pytorch实现–测试阶段代码解析(下) 论文提出了一种新颖的神经表面重建方法&#xff0c;称为NeuS&#xff0c;用于从2D图像输入以高保真度重建对象和场景。在NeuS中建议将曲面表示为有符号距离函数(SDF)的零级集&#xff0c;并开发一种新的体绘…

3D医学教学虚拟仿真系统:身临其境感受人体结构和功能

3D医学教学虚拟仿真系统是一种基于虚拟现实技术的教学工具&#xff0c;它可以帮助学生更好地理解和掌握医学知识。这种课件通常包括人体解剖学、生理学、病理学等方面的教学内容&#xff0c;通过三维立体的图像和动画展示&#xff0c;让学生更加直观地了解人体结构和功能。 与传…

今天七夕,群友让我帮忙给他分配一个对象,于是我。。。

今天七夕&#xff0c;群友让我帮忙给他分配一个对象&#xff0c;于是我只好尝试给他分配对象了&#xff1a; CGirlFrined *pGF new CGirlFrined("大屌萌妹");int nRet (群友).SetGirlFriend(pGF);if (nRet ! 0) {alert("分配失败&#xff01;"); }后来觉…

交换机生成树STP

生成树协议&#xff08;spanning-tree-protocol,stp&#xff09;&#xff1a;在具有物理环路的交换机网络上生成没有回路的逻辑网络的方法&#xff0c;生成树协议使用生成树算法&#xff0c;在一个具有冗余路径的容错网络中计算出一个无环路的路径&#xff0c;使一部分端口处于…

「UG/NX」Block UI 超级截面SuperSection

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

easyexcel合并单元格底色

一、效果图 二、导出接口代码 PostMapping("selectAllMagicExport")public void selectAllMagicExport(HttpServletRequest request, HttpServletResponse response) throws IOException {ServiceResult<SearchResult<TestMetLineFe2o3Export>> result …

【3D激光SLAM】LOAM源代码解析--transformMaintenance.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp 【3D激光SLAM】LOAM源代码解析–laserMapiing.cpp 【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 写在前面 本系列文章将对LOAM源代码进行讲解…

Hadoop学习:深入解析MapReduce的大数据魔力(三)

Hadoop学习&#xff1a;深入解析MapReduce的大数据魔力&#xff08;三&#xff09; 3.5 MapReduce 内核源码解析3.5.1 MapTask 工作机制3.5.2 ReduceTask 工作机制3.5.3 ReduceTask 并行度决定机制 3.6 数据清洗&#xff08;ETL&#xff09;1&#xff09;需求2&#xff09;需求…

python实战【外星人入侵】游戏并改编为【梅西vsC罗】(球迷整活)——搭建环境、源码、读取最高分及生成可执行的.exe文件

文章目录 &#x1f3a5;前言&#x1f4bc;安装Pygame&#x1f50b;游戏的实现读写并存储【外星人入侵】游戏最高分游戏源码alien_invasion.pygame_functions.pyship.pyalien.pybullet.pybutton.pyscoreboard.pygame_stats.pysettings.py宇宙飞船和外星人的 .bmp类型文件 &#…

Java之继承详解二

3.7 方法重写 3.7.1 概念 方法重写 &#xff1a;子类中出现与父类一模一样的方法时&#xff08;返回值类型&#xff0c;方法名和参数列表都相同&#xff09;&#xff0c;会出现覆盖效果&#xff0c;也称为重写或者复写。声明不变&#xff0c;重新实现。 3.7.2 使用场景与案例…

hive表的全关联full join用法

背景&#xff1a;实际开发中需要用到全关联的用法&#xff0c;之前没遇到过&#xff0c;现在记录一下。需求是找到两张表的并集。 全关联的解释如下&#xff1b; 下面建两张表进行测试 test_a表的数据如下 test_b表的数据如下&#xff1b; 写第一个full join 的SQL进行查询…

基于 BlockQueue(阻塞队列) 的 生产者消费者模型

文章目录 阻塞队列&#xff08;BlockQueue&#xff09;介绍生产者消费者模型 介绍代码实现lockGuard.hpp&#xff08;&#xff09;Task.hpp&#xff08;任务类&#xff09;BlockQueue.hpp&#xff08;阻塞队列&#xff09;conProd.cc&#xff08;生产者消费者模型 主进程&#…

pytest自动化框架运行全局配置文件pytest.ini

还记得在之前的篇章中有讲到Pytest是目前主要流行的自动化框架之一&#xff0c;他有基础的脚本编码规则以及两种运行方式。 pytest的基础编码规则是可以进行修改&#xff0c;这就是今日文章重点。 看到这大家心中是否提出了两个问题&#xff1a;pytest的基础编码规则在哪可以…

探索高效的HTTP异步接口测试方法:从轮询等待到自动化方案

本文将深入探讨HTTP异步接口测试的多个方面&#xff0c;包括轮询等待、性能测试以及自动化方案。通过详细的解释和实际案例&#xff0c;帮助您了解如何有效地测试异步接口&#xff0c;确保系统的稳定性和性能。 在现代软件开发中&#xff0c;HTTP异步接口扮演着至关重要的角色&…

QCustomPlot绘制多条曲线在不同的位置

ui->setupUi(this);QCPLayoutGrid* layout ui->customPlot->plotLayout();//把之前的布局清除layout->clear();//设置行间距layout->setRowSpacing(0);layout->setColumnSpacing(0);// 2. 准备数据QVector<double> x(101), y(101);for (int i 0; i &…