C++ 优先算法——复写零(双指针)

news2024/12/25 9:28:44

目录

题目:复写零

1. 题目解析

2. 算法原理

一. 先找到最后一个“复写”数

处理边界情况

二. 复写操作

3. 代码实现


题目:复写零

1. 题目解析

题目截图:

该题目要求的与移动零相似,都要在一个数组上进行操作,它还要要求的是,这个数组长度大小不会被改变,在原有的数组上遇到0就复写一遍,遇到非零就不用复写。

这道题直接上来就在一个数组上考虑情况稍微会困难一些,可以假设让它可以开辟额外一个数组(两个数组)来考虑,最后在结合双指针到一个数组上会好解答。

 

 题目大致情况双数组的话是上图所示,接下来转化到一个数组上双指针操作。

2. 算法原理

上述的介绍,这道题也是用双指针算法,不过这种双指针算法是先根据“异地“操作(也就是在额外开辟的数组操作),然后优化成双指针下的”就地“操作(在当前数组操作,不额外开辟数组)。

融入一个数组上就是:

 但是这出现了一个问题,下面cur就指向0了,遇0是要复写一遍的(也就是要写两遍)

 此时,就造成数据被覆盖导致丢失数据了,所以顺序遍历数组操作还是有问题的,要解决此问题,可以考虑尝试逆序操作。

然后按照上面逻辑,遇到0就抄写两遍,遇到非零直接抄写一遍即可,再统一向后移动1位。 

 

这样可以避免出现顺序时候后面未被复写的数据被覆盖的情况了。

大致思路如上面图所示,归纳一下:

一. 先找到最后一个“复写”数

这个也要用双指针算法来去寻找它,我们把dest定义为最后需要复写的位置(结果中数组最后一个位置),因此刚开始时,并不知道最后位置在哪,让dest指向-1;cur的作用:从前往后遍历数组,决定dest走1步还是2步。所以可以仅需要判断dest是否走向最后位置来判断是否找到最后要复写的数。

// 先找到最后一个要复写的数
int dest = -1; // 复写位置
int cur = 0;   // 遍历数组
while (cur < arr.size()) {
    if (arr[cur] == 0) {  //遇到0,dest移动两位
        dest += 2;
    }
    else {
        ++dest;
    }
    if (dest >= arr.size() - 1) {  //判断dest是否走向结尾
        break;
    }
    ++cur;
}

处理边界情况

也就是说,因为遇到0,dest要加2,这样的话会导致上图情况。越界时,一定是cur等于0导致的,所以就可以单独处理它。

//单独处理边界情况--cur走到最后要复写的数为0,dest复写就导致越界访问的情况
if (dest == arr.size()) {
    arr[arr.size() - 1] = 0;
    --cur;
    dest -= 2;
}

总结:

  1. 先判断cur的值(是0或非0元素)
  2. 根据cur的值决定dest向后移动1步或2步。
  3. 先判断dest是否已经走到结束的位置
  4. 判断后,若没有结束,cur再向后移动1位
  • 特殊情况,cur走到最后要复写的数为0,单独处理越界情况。

二. 复写操作

既然是逆序,那么就是要从后向前完成复写操作

注意:遇到0要多写一遍0

//从后向前复写
 while (dest >= 0) {
            if (arr[cur] == 0) {
                // 遇到0要记得复写两遍0
                arr[dest--] = 0;
            }
            arr[dest--] = arr[cur--];
        }

3. 代码实现

题目链接

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        // 先找到最后一个要复写的数
        int dest = -1; // 复写位置
        int cur = 0;   // 遍历数组
        while (cur < arr.size()) {
            if (arr[cur] == 0) {
                dest += 2;
            } else {
                ++dest;
            }
            if (dest >= arr.size() - 1) {
                break;
            }
            ++cur;
        }

        // 从后往前复写
        // 还要单独处理边界情况--cur走到最后要复写的数为0,dest复写导致越界访问的情况
        if (dest == arr.size()) {
            arr[arr.size() - 1] = 0;
            --cur;
            dest -= 2;
        }
        while (dest >= 0) {
            if (arr[cur] == 0) {
                // 遇到0要记得复写两遍0
                arr[dest--] = 0;
            }
            arr[dest--] = arr[cur--];
        }
    }
};

提交记录:

制作不易,若有不足之处或出问题的地方,请各位大佬多多指教 ,感谢大家的阅读支持!!! 

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

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

相关文章

掌握DFMEA,让潜在设计缺陷无处遁形!

一个微小的设计缺陷&#xff0c;就可能让一款产品从市场宠儿变成过客。那么&#xff0c;如何在设计初期就精准识别并扼杀这些潜在威胁呢&#xff1f;答案就是——巧妙运用DFMEA&#xff08;设计失效模式与效应分析&#xff09;。本文&#xff0c;天行健企业管理咨询公司将详细阐…

时间序列预测(十)——长短期记忆网络(LSTM)

目录 一、LSTM结构 二、LSTM 核心思想 三、LSTM分步演练 &#xff08;一&#xff09;初始化 1、权重和偏置初始化 2、初始细胞状态和隐藏状态初始化 &#xff08;二&#xff09;前向传播 1、遗忘门计算&#xff08;决定从上一时刻隐状态中丢弃多少信息&#xff09; 2、…

FlaskFastAPIgunicornunicorn并发调用

Flask VS. FastAPI Flask和FastAPI是Python中两种流行的Web框架&#xff0c;它们各自具有不同的特点和适用场景。以下是它们之间的一些主要区别&#xff1a; 1. 框架类型 Flask&#xff1a;Flask是一个轻量级的微框架&#xff0c;适合构建小型到中型的Web应用。它灵活且易于扩展…

安装scrcpy-client模块av模块异常,环境问题解决方案

背景 使用 pip install scrcpy-client命令出现以下报错 performance hint: av\logging.pyx:232:5: Exception check on log_callback will always require the GIL to be acquired. Possible solutions: 1. Declare log_callback as noexcept if you control the definition …

Linux——常见指令及其权限理解(正在更新中)

1.指令 1.1 快速了解指令 pwd 首次登录&#xff0c;默认所处的路径 whoami 当前所用的用户的名称 ls 显示当前路径下&#xff0c;文件名称 mkdir 在当前目录下&#xff0c;创建一个文件夹/目录 cd 进入一个目录 touch 新建一个文…

胡壮麟《语言学教程》第五版PDF英文版+中文版翻译

胡壮麟《语言学教程》中文版&#xff1a;https://pan.quark.cn/s/9491130ec572 《语言学教程》&#xff08;英文版&#xff09;是一部经典的语言学教材&#xff0c;自 1988 年面世以来&#xff0c;被众多高校广泛采用&#xff0c;长销不衰。该教材自出版以来不断修订&#xff…

项目模块十二:TcpServer模块

一、模块设计思路 1、目的 对所有模块整合&#xff0c;实现一个服务器模块供外部快速搭建服务器。 2、管理 监听套接字 主 Reactor&#xff0c;创建 EventLoop _baseloop 对象&#xff0c;进行对监听套接字的管理 哈希表管理所有新连接的 Channel 创建线程池进行连接的事…

【Spring源码核心篇-01】精通Spring的bean的生命周期

Spring源码核心篇整体栏目 内容链接地址【一】Spring的bean的生命周期https://zhenghuisheng.blog.csdn.net/article/details/143441012 spring的bean的生命周期 一&#xff0c;spring中bean的生命周期1&#xff0c;生成BeanDefinition1.1&#xff0c;初始化context和BeanFacto…

IAR出现,Error [e12].Unable to open file "xxxx:_app.xcl"怎么办?

编译时出现&#xff0c;一般是拷贝过来出现这个问题。解决方法: 1&#xff0c;点击到最左边“code -Debug”上 2&#xff0c;点Project>>>options for node &#xff02;code&#xff02; 3&#xff0c;选项卡“linker”>>&#xff02;linker configuration fil…

C#与C++交互开发系列(十一):委托和函数指针传递

前言 在C#与C的互操作中&#xff0c;委托&#xff08;delegate&#xff09;和函数指针的传递是一个复杂但非常强大的功能。这可以实现从C回调C#方法&#xff0c;或者在C#中调用C函数指针的能力。无论是跨语言调用回调函数&#xff0c;还是在多线程、异步任务中使用委托&#x…

SpringBoot国际化:创建多语言支持的Web应用

SpringBoot国际化&#xff1a;创建多语言支持的Web应用 介绍 SpringBoot作为一个强大的框架&#xff0c;提供了便捷的国际化支持&#xff0c;使开发者能够轻松创建多语言支持的Web应用。通过使用SpringBoot的MessageSource&#xff0c;开发者可以在应用中实现动态的语言切换。…

如何快速搭建一个3D虚拟展厅?

随着元宇宙概念的兴起&#xff0c;一个全新的虚拟、立体数字空间正逐步成为我们生活的一部分。在这个空间里&#xff0c;用户可以沉浸其中&#xff0c;进行丰富的交互操作&#xff0c;体验前所未有的无限可能。而如何快速搭建一个属于自己的元宇宙3D虚拟展厅&#xff0c;正成为…

blender 小车建模 建模 学习笔记

一、学习blender视频教程链接 案例4&#xff1a;狂奔的小车_建模_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Bt4y1E7qn?p14&spm_id_from333.788.videopod.episodes&vd_sourced0ea58f1127eed138a4ba5421c577eb1 二、开始建模 &#xff08;1&#xff09;创…

强大的文本编辑器Notepad++8.4.6 最新版

Notepad最新版是一款多功能的代码编辑工具。Notepad官方版支持27种编程语言&#xff0c;涵盖C、C 、Java 、C#,、XML、 HTML,、PHP、python等等&#xff0c;能够帮助程序员提高编辑效率。Notepad软件支持python与sql代码高亮功能&#xff0c;并且免费开源&#xff0c;能够完美地…

彻底理解链表(LinkedList)结构

目录 比较操作结构封装单向链表实现面试题 循环链表实现 双向链表实现 链表&#xff08;Linked List&#xff09;是一种线性数据结构&#xff0c;由一组节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两个部分&#xff1a;数据域&#xff08;存储数据&#xff…

小小猫棒onu替换家用光猫,薅运营商带宽羊毛,突破1000M

小小猫棒onu 一、总体步骤 1 记录原来光猫信息 主要包括SN&#xff0c;ploam密码&#xff0c;loid、loid密码、 mac、上网的vlan id等 一般gpon采用SN、ploam密码、SNploam密码三种中的一种认证方式 一般Epon采用loid&#xff08;逻辑id&#xff09;、mac、loid mac三种中…

【经典论文阅读11】ESMM模型——基于贝叶斯公式的CVR预估

传统的CVR模型&#xff08;也就是直接对conversion rate建模的模型&#xff09;在实际应用中面临两个问题&#xff08;样本选择偏差与数据稀疏性问题&#xff09;。为了解决这两个问题&#xff0c;本文提出ESMM模型。该模型巧妙地利用用户行为序列去建模这个问题&#xff0c;从…

二十八、Python基础语法(面向对象-下)

一、self 从函数的语法上来看, self 是形参 , 是一个普通的参数,那么在调用的时候,就需要传递实参值。从调用上看, 我们没有给 self 这个形参传递实参值, 但是 Python 解释器会自动的将调用这个方法的对象&#xff0c;作为实参值传递给 self。 class Dog:def eat(self):print…

江协科技STM32学习- P27 实验-串口发送/串口接收

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

基于大语言模型(LLM)自主Agent 智能体综述

近年来,LLM(Large Language Model)取得了显著成功,并显示出了达到人类智能的巨大潜力。基于这种能力,使用LLM作为中央控制器来构建自助Agent,以获得类人决策能力。 Autonomous agents 又被称为智能体、Agent。指能够通过感知周围环境、进行规划以及执行动作来完成既定任务。…