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

news2024/11/24 16:39:59

文章目录

  • 前言
  • 一、复写零
    • 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.coloradmin.cn/o/909596.html

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

相关文章

SpringCloud Gateway服务网关的介绍与使用

目录 1、网关介绍2、SpringCloudGateway工作原理3、三大组件3.1 、Route&#xff08;路由&#xff09;3.2、断言 Predicate3.3、过滤器 filter 4、Gateway整合nacos的使用4.1 、引入依赖4.2、 编写基础类和启动类4.3、 编写基础配置和路由规则4.4 、测试结果 1、网关介绍 客户…

营销数字化|企业级 AIGC 工具的「iPhone 时刻」

2007 年&#xff0c;乔布斯发布了第一款 iPhone&#xff0c;从此彻底改变了手机行业的市场走向。iPhone 成功的背后&#xff0c;一个很重要的原因是&#xff1a;它让用户以更简单、更符合直觉的方式来使用手机。 如今&#xff0c;AIGC 工具也在等待它的「iPhone 时刻」&#xf…

C++信息学奥赛1119:矩阵交换行

解题思路&#xff1a;当输出时换行 解题程序&#xff1a; #include<iostream> using namespace std; int main() {int arr[5][5];// 输入矩阵元素for(int i0;i<5;i){for(int j0;j<5;j){cin>>arr[i][j];}} int n,m;cin>>n>>m;// 根据条件进行矩…

RT-Thread学习日记——点亮LED

最近开始接触RT-Thread&#xff0c;后面会单独建立专栏以此记录我的学习过程&#xff0c;如果能给你的学习提供参考&#xff0c;本人倍感荣幸。 学习工具&#xff1a;正点原子战舰开发板 一、、点亮LED 在RT-Thread的配置项里搜索LED可以看到和LED相关的很多内容&#xff0c…

AutoDev 1.1.3 登场,个性化 AI 辅助:私有化大模型、自主设计 prompt、定义独特规则...

在过去的半个月里&#xff0c;我们为开源辅助编程工具 AutoDev 添加了更强大的自定义能力&#xff0c;现在你可以&#xff1a; 使用自己部署的开源大模型自己配置 Intellij IDEA 中的行为自定义开发过程中的规范 当然了&#xff0c;如果您自身拥有开发能力的话&#xff0c;建议…

无涯教程-PHP - XML

简单的XML解析器解析 Name&#xff0c; attributes 和 textual content&#xff0c;简单的XML函数如下所示- simplexml_load_file() 此函数接受文件路径作为第一个参数&#xff0c;这是必需的。 simplexml_load_file(($fileName,$class,$options,$ns,$is_prefix) simplexml…

springMVC Unix 文件参数变更漏洞修复

错误信息如下&#xff1a; 解决方案&#xff1a; 原因&#xff1a;未对用户输入正确执行危险字符清理 未检查用户输入中是否包含“…”&#xff08;两个点&#xff09;字符串&#xff0c;比如 url 为 /login?action…/webapps/RTJEKSWTN26635&typerandomCode cookie为Coo…

飞天使-kubeadm安装一主一从集群

文章目录 安装前准备安装前准备配置yum源等安装前准备docker安装 安装kubeadm配置kubeadm验证集群 参考链接 安装前准备 cat >> /etc/hosts <<EOF 192.168.100.30 k8s-01 192.168.100.31 k8s-02 EOF hostnamectl set-hostname k8s-01 #所有机器按照要求修改 ho…

React笔记[tsx]-解决Property ‘frames‘ does not exist on type ‘Readonly<{}>‘

浏览器报错如下&#xff1a; 编辑器是这样的&#xff1a; 原因是React.Component<any>少了后面的any&#xff0c;改成这样即可&#xff1a; export class CustomFrame extends React.Component<any, any>{............ }

CH02_重构的原则(什么是重构、为什么重构、何时重构)

什么是重构 重构&#xff08;名词&#xff09;&#xff1a;对软件内部结构的一种调整&#xff0c;目的是在不改变软件可观察行为的前提下&#xff0c;提高其可理解性&#xff0c;降低其修改成本。 重构&#xff08;动词&#xff09;&#xff1a;使用一系列重构手法&#xff0…

Lnton羚通算法算力云平台在环境配置中当使用conda创建新的虚拟环境时为什么会遇到错误

当使用conda创建新的虚拟环境时遇到错误&#xff0c;可能是由于以下一些常见原因导致的&#xff1a; Conda环境未正确安装&#xff1a;请确保你已经正确安装了Conda&#xff0c;并且设置了正确的环境变量。你可以尝试在终端中运行conda --version来验证Conda是否已经成功安装并…

STM32设置为I2C从机模式(HAL库版本)

STM32设置为I2C从机模式&#xff08;HAL库版本&#xff09; 目录 STM32设置为I2C从机模式&#xff08;HAL库版本&#xff09;前言1 硬件连接2 软件编程2.1 步骤分解2.2 测试用例 3 运行测试3.1 I2C连续写入3.2 I2C连续读取3.3 I2C单次读写测试 4 总结 前言 我之前出过一篇关于…

ios小组件报错:Please adopt containerBackground API

iOS 17 小组件报错:Please adopt containerBackground API 使用下面的方法解决了: 代码: extension View {func widgetBackground(_ backgroundView: some View) -> some View {if #available(iOSApplicationExtension 17.0, *) {return containerBackground(for: .wi…

恒运资本:信创概念再度活跃,华是科技再创新高,南天信息等涨停

信创概念21日盘中再度活跃&#xff0c;截至发稿&#xff0c;华是科技涨超17%&#xff0c;盘中一度触及涨停再创新高&#xff0c;中亦科技涨超13%亦创出新高&#xff0c;久其软件、南天信息、新炬网络、英飞拓均涨停。 音讯面上&#xff0c;自8月3日以来&#xff0c;财政部官网连…

YOLOX在启智AI GPU/CPU平台部署笔记

文章目录 1. 概述2. 部署2.1 拉取YOLOX源码2.2 拉取模型文件yolox_s.pth2.3 安装依赖包2.4 安装yolox2.5 测试运行2.6 运行报错处理2.6.1 ImportError: libGL.so.1: cannot open shared object file: No such file or directory2.6.2 ImportError: libgthread-2.0.so.0: cannot…

推荐一款好用的开源视频播放器(免费无广告)

mpv是一个自由开源的媒体播放器&#xff0c;它支持多种音频和视频格式&#xff0c;并且具有高度可定制性。mpv的设计理念是简洁、高效和功能强大。 软件特点&#xff1a; 1. 开源、跨平台。可以在Windows\Linux\MacOS\BSD等系统上使用&#xff0c;完全免费无广告。Windows版解压…

Selenium环境+元素定位大法

selenium 与 webdriver Selenium 是一个用于 Web 测试的工具&#xff0c;测试运行在浏览器中&#xff0c;就像真正的用户在手工操作一样。支持所有主流浏览器 WebDriver 就是对浏览器提供的原生API进行封装&#xff0c;使其成为一套更加面向对象的Selenium WebDriver API。 使…

JSON简介及前端简单解析(一)

JSON现在常用来做前后端数据交互&#xff0c;两个蝴蝶飞只是简单的对JSON做一下讲解和简单使用。关于JSON,我还了解的远远不够。由于本人经验有限&#xff0c;嘴皮子不溜&#xff0c;所以学术性&#xff0c;概念性&#xff0c;底层性的知识点暂时不做介绍。文章中有错误之处&am…

QT中资源文件resourcefile的使用,使用API完成页面布局

QT中资源文件resourcefile的使用 之前添加图标的方法使用资源文件的方法创建资源文件资源文件添加前缀资源文件添加资源使用资源文件中的资源 使用API完成布局使用QHBoxLayout完成水平布局使用QVBoxLayout完成垂直布局使用QGridLayout完成网格布局 在Qt中引入资源文件好处在于他…

设计模式之创建者模式

文章目录 一、介绍二、应用三、案例1. 麦当劳11随心配2. 代码演示3. 演示结果 四、优缺点五、送给读者 一、介绍 建造者模式(Builder Pattern)属于创建型设计模式&#xff0c;很多博客文章的对它的作用解释为用于将复杂对象的创建过程与其细节表示分离。但对于初学者来说&…