当前位置: 首页 > article >正文

复写零——双指针算法

题目链接

复写零icon-default.png?t=O83Ahttps://leetcode.cn/problems/duplicate-zeros/description/

题目要求

样例

题目分析

     先看示例1,题目要求将数组中所有的0,均复写一遍,且要在原数组上进行更改,多余的元素消失

 

    但我们发现,如果双指针从后往前遍历,即 

    cur 初始指向最后一个复写的数,按上述方法,进行从后往前复写,显然是可以的,所以我们首先要找出最后一个复写的数,再进行遍历即可

算法思路 

        如果「从前向后」进行原地复写操作的话,由于 0 的出现会复写两次,导致没有复写的数「被覆盖掉」。因此我们选择「从后往前」的复写策略。

        但是「从后向前」复写的时候,我们需要找到「最后⼀个复写的数」,因此我们的⼤体流程分两 步:

                i. 先找到最后⼀个复写的数

                ii. 然后从后向前进行复写操作 ;

个人复写思路 

    1、找到最后复写的数 

        (1)定义两个指针如下图,判断cur的值处是否为 0 ?

                为 0dest 后移两步

                不为 0:dest 后移一步

        (2)判断 dest 是否指向数组最后一个元素位置 ,如果是,则停止,不是 cur 后移一步

        (3) 最后 cur 指向即最后复写元素

    2,判断 dest 是否越界

此情况下,dest 会越界,此时我们需要将数组最后位置设置为 0 ,dest 前移2步,cur 前移1步即可,如图:

     3、从后向前进行复写操作

解题代码

class Solution {
    public void duplicateZeros(int[] arr) {
        int cur=0,dest=-1;
        while(cur<arr.length){
            if(arr[cur]==0){
                dest+=2;
            }else{
                dest++;
            }
            if(dest>=arr.le-1){
                break;
            }
            cur++;
        }
        if(dest==arr.length){
            arr[arr.length-1]=0;
            dest-=2;
            cur--;
        }
        while(cur>=0){
            if(arr[cur]==0){
                arr[dest--]=0;
                arr[dest--]=0;
            }else{
                arr[dest--]=arr[cur];
            }
            cur--;
        }
    }
}

http://www.kler.cn/news/328574.html

相关文章:

  • 自制CANTool_DBC差异比较工具DBCCompare_原理介绍(四)
  • 【架构】prometheus+grafana系统监控
  • 鸿蒙开发知识点速记全解
  • Python数据分析工具: Scikit-learn用法示例
  • android.bp cc_test
  • 木舟0基础学习Java的第三十一天(SpringMVC,xml式和注解式开发,携带数据,取值,视图解析)
  • Selenium(1)-webUI自动化环境部署,基本元素定位
  • 大学学校用电安全远程监测预警系统
  • Verilog基础:时序调度中的竞争(四)(描述时序逻辑时使用非阻塞赋值)
  • 车辆重识别(注意力 U-Net:学习在哪些区域寻找胰腺)论文阅读2024/10/01
  • 单体到微服务架构服务演化过程
  • 无人机跟踪
  • [网络]抓包工具介绍 tcpdump
  • 15.面试算法-树基础
  • 【深度学习】低维向量映射到高维空间的方法
  • 服装分类检测系统源码分享
  • 数据库重建索引的作用?
  • 编码能力提升计划 - 华为OD统一考试(E卷)
  • 2025届CS保研经验简帖
  • C#语言的历史与发展:从基础到高级的全面解析
  • Spring Boot技术在足球青训管理中的创新应用
  • 深入理解 WebSocket:实时通信的利器
  • 从基础到进阶:Docker 实践与应用的全方位解析
  • 维修保养记录接口-维修保养记录API-汽车接口
  • 【DAY20240927】经典深度学习模型对比:LeNet5、CNN、ResNet20、AlexNet、TextCNN 与 VGG-11
  • list的模拟实现
  • MySQL SQL基础常见面试题整理
  • PHP反序列化3(属性绕过)
  • 《PMI-PBA认证与商业分析实战精析》 第3章 需要评估
  • Typora使用与Markdown语法详细教程