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.hqwc.cn/news/81782.html

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

相关文章

C++实现字符串的逆置

目录 C和C的区别 【1】C对C的扩充 【2】C对C的兼容 第一个C程序 【1】hello world 【2】cout标准输出流对象 i&#xff09;介绍 ii&#xff09;运算 iii&#xff09;cout的使用 iv&#xff09;使用cout指定格式的输出 练习&#xff1a;1、输出斐波那契的前10项。 【3】…

Python爬虫猿人学逆向系列——第六题

题目&#xff1a;采集全部5页的彩票数据&#xff0c;计算全部中奖的总金额&#xff08;包含一、二、三等奖&#xff09; 地址&#xff1a;https://match.yuanrenxue.cn/match/6 本题比较简单&#xff0c;只是容易踩坑。话不多说请看分析。 两个参数&#xff0c;一个m一个f&…

021-从零搭建微服务-短信服务(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…

Redis持久化机制

为什么Redis会有持久化机制&#xff1a; Redis 是内存数据库&#xff0c;如果不将内存中的数据库状态保存到磁盘&#xff0c;那么一旦如果Redis服务器挂了&#xff0c;服务器中的数据就会丢失。所以 Redis 提供了持久化功能&#xff01; Redis有两种持久化方式&#xff08;RDB&…

文件服务器实现方式汇总

hello&#xff0c;伙伴们&#xff0c;大家好&#xff0c;今天这一期shigen来给大家推荐几款可以一键实现文件浏览器的工具&#xff0c;让你轻松的实现文件服务器和内网的文件传输、预览。 基于node 本次推荐的是http-server&#xff0c; 它的githuab地址是&#xff1a;http-s…

Android项目如何上传Gitee仓库

前言 最近Android项目比较多&#xff0c;我都是把Android项目上传到Gitee中去&#xff0c;GitHub的话我用的少&#xff0c;可能我还是更喜欢Gitee吧&#xff0c;毕竟Gitee仓库用起来更加方便 一. 创建Gitee仓库 1. 先创建一个Gitee账号&#xff0c;然后登录上去 2. 创建Androi…

设计模式原则及分类

一、概念 设计模式&#xff1a;&#xff08;Design pattern&#xff09;是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。用来提高代码可复用性、可维护性、可读性、稳健性以及安全性。 二、设计模式原则&#xff1a; 单一职责原则&#xff08;Single …

《Linux从练气到飞升》No.17 进程创建

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

ROS2 学习(五)接口,动作

接口 通信双方统一规定好接口。比如图像 img&#xff0c;控制运动的线速度和角速度…… 我们也不用了解具体实现&#xff0c;基本就是了解接口会去用就行。 $ ros2 interface list # 展示所有 interfaces $ ros2 interface show ... # 显示具体一个 interface $ ros2 package…

IBM Spectrum LSF License Scheduler

LSF License Scheduler 提供了两个版本: Basic Edition 和 Standard Edition。 LSF License Scheduler Basic Edition 随附于 LSF Standard Edition 和 Advanced Edition &#xff0c;并非旨在应用有关如何在集群或项目之间共享许可证的策略。 相反&#xff0c; LSF License S…

Mr. Cappuccino的第64杯咖啡——Spring循环依赖问题

Spring循环依赖问题 什么是循环依赖问题示例项目结构项目代码运行结果 Async注解导致的问题使用Lazy注解解决Async注解导致的问题开启Aop使用代理对象示例项目结构项目代码运行结果 Spring是如何解决循环依赖问题的原理源码解读 什么情况下Spring无法解决循环依赖问题 什么是循…

生成式人工智能的潜在有害影响与未来之路(三)

产品责任法的潜在适用 背景和风险 产品责任是整个二十世纪发展起来的一个法律领域&#xff0c;旨在应对大规模生产的产品可能对社会造成的伤害。这一法律领域侧重于三个主要危害&#xff1a;设计缺陷的产品、制造缺陷的产品和营销缺陷的产品。产品责任法的特点有两个要素&…