优选算法|【双指针】|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,有越界的时候是等于arrSize
        if(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--];
        }
    }
    
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣hot100题解(python版41-43题)

41、二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例…

STM32 GPIO的几种工作模式

介绍STM32 GPIO的几种工作模式 1、输出模式 STM32的引脚输出有两种方式&#xff1a; 1、推挽输出 2、开漏输出 1.1 推挽输出 当引脚设置为推挽输出时&#xff0c;P-MOS和N-MOS共同配合工作。 当使用HAL库 //该函数的作用就是将P-MOS导通&#xff0c;N-MOS关…

链式插补 (MICE):弥合不完整数据分析的差距

导 读 数据缺失可能会扭曲结果&#xff0c;降低统计功效&#xff0c;并且在某些情况下&#xff0c;导致估计有偏差&#xff0c;从而破坏从数据中得出的结论的可靠性。 处理缺失数据的传统方法&#xff08;例如剔除或均值插补&#xff09;通常会引入自己的偏差或无法充分利用数…

网页版图像处理软件开发服务:助您项目在市场竞争中脱颖而出

在当今数字化时代&#xff0c;图像处理在各个行业中扮演着重要的角色&#xff0c;虎克专注于提供定制化的网页版图像处理软件开发服务&#xff0c;为您的项目保驾护航。 1.网页版图像处理软件的定制化需求 1.1行业特定功能 针对不同的业务需求&#xff0c;深入了解行业特点&…

前端打包部署(黑马学习笔记)

我们的前端工程开发好了&#xff0c;但是我们需要发布&#xff0c;那么如何发布呢&#xff1f;主要分为2步&#xff1a; 1.前端工程打包 2.通过nginx服务器发布前端工程 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的build按钮来完…

微信小程序云开发教程——墨刀原型工具入门(添加交互事件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

13 双口 RAM IP 核

双口 RAM IP 核简介 双口 RAM IP 核有两个端口&#xff0c;它又分为伪双端口 RAM 和真双端口 RAM&#xff0c;伪双端口 RAM 一个端口只能读&#xff0c;另一个端口只能 写&#xff0c;真双端口 RAM 两个端口都可以进行读写操作。同时对存储器进行读写操作时就会用到双端口 RAM…

LeetCode受限条件下可到达节点的数目

题目描述 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - 1 条边。 给你一个二维整数数组 edges &#xff0c;长度为 n - 1 &#xff0c;其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restr…

决策树实验分析(分类和回归任务,剪枝,数据对决策树影响)

目录 1. 前言 2. 实验分析 2.1 导入包 2.2 决策树模型构建及树模型的可视化展示 2.3 概率估计 2.4 绘制决策边界 2.5 决策树的正则化&#xff08;剪枝&#xff09; 2.6 对数据敏感 2.7 回归任务 2.8 对比树的深度对结果的影响 2.9 剪枝 1. 前言 本文主要分析了决策树的分类和回…

matplotlib——散点图和条形图(python)

散点图 需求 我们获得北京2016年三月和十月每天白天最高气温&#xff0c;我们现在需要找出气温随时间变化的某种规律。 代码 # 导入库 from matplotlib import pyplot as plt import random# 解决中文乱码 import matplotlib matplotlib.rc("font",family"F…

详细讲解Docker架构的原理、功能以及如何使用

一、简介 1、了解docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化&#xff0c;以便隔离进程和资源&#xff0c;而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中&…

如何解决线程安全问题(synchronized、原子性、产生线程不安全的原因,锁的特性,加锁的方式等等干货)

文章目录 &#x1f490;线程不安全的示例&#x1f490;锁的特性&#x1f490;产生线程不安全的原因&#xff1a;&#x1f490;加锁的三种方式 &#x1f490;线程不安全的示例 对于线程安全问题&#xff0c;这里用一个例子进行讲解&#x1f447;&#xff1a; 我现在定义一个变…

Image Fusion via Vision-Language Model【文献阅读】

阅读目录 文献阅读AbstractIntroduction3. Method3.1. Problem Overview3.2. Fusion via Vision-Language Model 4. Vision-Language Fusion Datasets5. Experiment5.1Infrared and Visible Image Fusion 6. Conclusion个人总结 文献阅读 原文下载&#xff1a;https://arxiv.or…

串及BF朴素查找算法(学习整理):

关于串的相关定义&#xff1a; 串&#xff1a;用‘ ’表示的字符序列空串&#xff1a;包含零个字符的串子串&#xff1a;包含传本身和空串的子串 eg: abc(,a,b,c,ab,bc,ac,abc)共7个&#xff1a;串的长度的阶乘1&#xff08;空串&#xff09;真子串&#xff1a;不包含自身的所…

Java进阶-IO(3)

话接上回&#xff0c;继续java IO的学习。上一次说完了字符流的读写数据&#xff0c;这次将基础部分剩余的一点内容看完。 一、流按功能分类 1、系统流 1.1 概述 系统流的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流。 System.in&#xff1a;标…

腾讯云幻兽帕鲁服务器中,如何检查并确保所有必要的配置文件(如PalWorldSettings.ini和WorldOption.sav)正确配置?

腾讯云幻兽帕鲁服务器中&#xff0c;如何检查并确保所有必要的配置文件&#xff08;如PalWorldSettings.ini和WorldOption.sav&#xff09;正确配置&#xff1f; 登录腾讯云控制台&#xff1a;登录轻量云控制台&#xff0c;找到部署了幻兽帕鲁的服务器&#xff0c;单击实例卡片…

基于BP-Adaboost的预测与分类,附MATLAB代码免费获取

今天为大家带来一期基于BP-Adaboost的预测与分类。代码中的BP可以替换为任意的机器学习算法。 原理详解 BP-AdaBoos模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。关于更多的原…

关于编写测试用例的一些思考

测试用例是QA同学的基本功&#xff0c;每个人都有一套编写测试用例的体系&#xff0c;本文是作者结合自身的工作经验以及阅读一些测试相关的书籍后的一些看法&#xff0c;欢迎大家一起讨论学习。 测试设计 测试用例格式 面试中一些常见的问题 1.APP测试与服务端测试的区别&am…

计算机设计大赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

StarRocks实战——首汽约车实时数仓实践

目录 前言 一、引入背景 二、OLAP引擎选型 三、架构演进 四、实时数仓构建 五、业务实践价值未来规划 原文大佬的这篇首汽约车实时数仓实践有借鉴意义&#xff0c;这里摘抄下来用作学习和知识沉淀。 前言 首汽约车&#xff08;以下简称“首约”&#xff09;是首汽集团打造…