双指针算法解决 移动零 和 复写零问题

news2024/12/23 1:14:12

在这里插入图片描述

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻强烈推荐优质专栏: 🍔🍟🌯C++的世界(持续更新中)
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:讲解双指针算法解决 移动零 和 复写零问题
金句分享:
✨相较于一见钟情,我更喜欢惊鸿一瞥.✨

前言

目录

  • 前言
  • 一、移动零
    • 🍟解题思路:
    • 🍔代码实现:
  • 二、复写零
    • 🍟解题思路:
    • 🍔代码实现

一、移动零

题目链接:传送门

题目描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

注意要求:
必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

🍟解题思路:

本篇文章使用双指针算法解决,思路如下:
首先,虽然叫"双指针",但不一定非要是两个指针,这只是一种形象的说法,比如此题是数组,可以用两个整形变量作为下标.

  1. 创建一个"指针"cur,使其指向数组中第一个出现的0的位置.(如果数组中没有0,则直接返回).
  2. 创建第二个"指针" dest,从cur的下一个位置开始.
  3. ①如果dest指向的值是0,则继续dest继续往后遍历.
    ②如果dest指向的值是非0,则与cur进行交换.
  4. dest遍历结束,则完成要求.

我们这样操作可以将0都夹在curdest两个指针之间,最后dest指向最后,则0就全到数组最后面了.

图解:
在这里插入图片描述

🍔代码实现:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int sz=nums.size();  
        int cur=0; 

        //cur指针指向数组中第一个0
        while(nums[cur]!=0 && cur!=sz-1){
            ++cur;
        }

        if(cur==sz-1)return ;  //如果没有0,则直接返回
        
        //dest指针从cur指针的下一个开始
        int dest=cur+1;
        while(dest!=sz){
            if(nums[dest]!=0){       //如果这个数非0,则与cur交换          
                swap(nums[cur],nums[dest]);
                cur++;
            }
            ++dest;
        }
    }
};

二、复写零

题目链接:传送门

题目描述:

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意要求:
请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

🍟解题思路:

如果我们直接从左往右开始复写,当遇到0,需要复写两次0的时候,会将后面的数字给覆盖掉.
在这里插入图片描述
我们采取从后往前覆盖的方法.

  1. 创建一个"指针"cur和一个"指针"dest.
  2. cur指向最后一个需要复写的元素,dest指向复写后最后元素的位置.

那么如何找到这两个位置呢?

很简单,模拟一下复写过程即可.
cur往后遍历时,遇到非0,dest往后走一步.
遇到0,dest往后走两步.
dest走到最后一个元素的时候,结束,此时curdest都到达了指定位置.

处理特殊情况:

出界原因:
由于dest可能一次跳2步,很可能从倒数第二个位置+2直接出界,此时需要特殊处理.

导致出界,说明当dest指向倒数第二个位置的时候,cur指向0,则表明最后一个位置应该设置为0.

在这里插入图片描述

处理方式:
①将最后一个元素复写为0 .
dest-向左两步,指向倒数第二个位置.
cur向前一步.

  1. 最后:从右往左遍历,完成正常的复写.

图解:
在这里插入图片描述
在这里插入图片描述

🍔代码实现

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur = 0, dest = -1;
        int sz = arr.size();
		
		//让cur指向最后一个复写的位置,dest指向完成复写后最后一个元素的位置
        while (dest < sz) {
            if (arr[cur] == 0) {
                dest+=2;
            }else ++dest;
            if (dest >= sz - 1)break;
            ++cur;             
        }
        
        //处理特殊情况
        if (dest == sz) {
            arr[sz-1] = 0;
            dest-=2;
            --cur;
        }
        //从后往前复写
        while (cur >= 0) {
            if (arr[cur] == 0) {
                arr[dest--] = arr[cur];
            }
            arr[dest--] = arr[cur--];
        }
    }
};

这两道题目就讲到这里了,下次再见!
在这里插入图片描述

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

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

相关文章

IDEA常用AI插件

只推荐免费的 一、对话式AI 1. ChatGPT GPT-4 - Bito AI Code Assistant ChatGPT GPT-4 - Bito AI Code Assistant 插件地址&#xff1a;https://plugins.jetbrains.com/plugin/18289-chatgpt-gpt-4–bito-ai-code-assistant支持自定义prompt支持解释代码支持生成代码注释支持…

【2023最新版】Python全栈知识点总结

python全栈知识点总结 全栈即指的是全栈工程师&#xff0c;指掌握多种技能&#xff0c;并能利用多种技能独立完成产品的人。就是与这项技能有关的都会&#xff0c;都能够独立的完成。 全栈只是个概念&#xff0c;也分很多种类。真正的全栈工程师涵盖了web开发、DBA 、爬虫 、…

Bootstrap的媒体对象组件(图文展示组件),挺有用的一个组件。

Bootstrap的.media类是用于创建媒体对象的&#xff0c;媒体对象通常用于展示图像&#xff08;图片&#xff09;和文本内容的组合&#xff0c;这种布局在展示新闻文章、博客帖子等方面非常常见。.media类使得创建这样的媒体对象非常简单&#xff0c;通常包含一个图像和相关的文本…

操作系统——进程同步

&#xff08;一&#xff09;简答题 1.什么是临界资源&#xff1f;什么是临界区&#xff1f; 答&#xff1a;临界资源是指每次仅允许一个进程访问的资源。属于临界资源有硬件打印机、磁带机等,软件在消息缓冲队列、变量、数组、缓冲区等。 (2)不论是硬件临界资源,还是软件临界资…

CEC2013(MATLAB):狐猴优化算法(Lemurs Optimizer,LO)求解CEC2013(提供MATLAB代码及参考文献)

一、狐猴优化算法 狐猴优化算法&#xff08;Lemurs Optimizer&#xff0c;LO&#xff09;由Ammar Kamal Abasi等人于2022年提出&#xff0c;该算法模拟狐猴的跳跃和跳舞行为&#xff0c;具有结构简单&#xff0c;思路新颖&#xff0c;搜索速度快等优势。狐猴优化算法&#xff…

Java身份证OCR识别 - 阿里云API【识别准确率超过99%】

1. 阿里云API市场 https://market.aliyun.com/products/57124001/cmapi00063618.html?spm5176.28261954.J_7341193060.41.60e52f3drduOTh&scm20140722.S_market%40%40API%E5%B8%82%E5%9C%BA%40%40cmapi00063618._.ID_market%40%40API%E5%B8%82%E5%9C%BA%40%40cmapi0006361…

AI向量数据库

矢量数据库是一种将数据存储为高维向量的数据库&#xff0c;高维向量是特征或属性的数学表示。 每个向量都有一定数量的维度&#xff0c;范围从几十到几千不等&#xff0c;具体取决于数据的复杂性和粒度。 矢量数据库&#xff08;Vector Database&#xff09;和矢量开发库&…

《视觉 SLAM 十四讲》V2 第 10 讲 后端优化2 简化BA 【位姿图】

文章目录 第10讲 后端210.1 滑动窗口滤波 和 优化10.1.2 滑动窗口法 10.2 位姿图10.3 实践&#xff1a; 位姿图优化本讲 CMakeLists.txt 10.3.1 g2o 原生位姿图 【Code】10.3.2 李代数上的位姿优化 【Code】 习题10题1 【没推完】 LaTex 第10讲 后端2 滑动窗口优化 位姿图优化…

【iOS】使用单例封装通过AFNetworking实现的网络请求

这里写目录标题 前言单例封装网络请求1. 首先创建一个继承于NSObject的单例类&#xff0c;笔者这里以Manager对单例类进行命名&#xff0c;然后声明并实现单例类的初始化方法2.实现完单例的创建方法后我们即可通过AFNetworking中的GET方法进行网络请求3.在Controller文件中创建…

音频录制和处理软件 Audio Hijack mac中文版说明

Audio Hijack mac是一款功能强大的音频录制和处理软件&#xff0c;它可以帮助用户从各种来源捕获和处理音频。 首先&#xff0c;Audio Hijack具有灵活的音频捕获功能。它支持从多个来源录制音频&#xff0c;包括麦克风、应用程序、网络流媒体、硬件设备等等。你可以选择捕获整个…

2022最新版-李宏毅机器学习深度学习课程-P26 Recurrent Neural Network

RNN 应用场景&#xff1a;填满信息 把每个单词表示成一个向量的方法&#xff1a;独热向量 还有其他方法&#xff0c;比如&#xff1a;Word hashing 单词哈希 输入&#xff1a;单词输出&#xff1a;该单词属于哪一类的概率分布 由于输入是文字序列&#xff0c;这就产生了一个问…

云表|低代码开发崛起:重新定义企业级应用开发

低代码开发这个概念在近年来越来越受到人们的关注&#xff0c;市场对于低代码的需求也日益增长。据Gartner预测&#xff0c;到2025年&#xff0c;75&#xff05;的大型企业将使用至少四种低代码/无代码开发工具&#xff0c;用于IT应用开发和公民开发计划。 那么&#xff0c;为什…

新的 Work Node 如何加入 K8s 集群 - Kubeadm ?

Author&#xff1a;rab 1、新的 work node 节点安装 kubelet、kubeadm 添加 k8s 镜像源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgch…

基于FPGA的SPI读写M25P16 Flash芯片

文章目录 一、SPI协议简介1.1 SPI引脚1.2 时钟极性和时钟相位1.3 主从模式 二、Flash&#xff08;M25P16&#xff09;2.1 Flash简介2.2 M25P16芯片分析2.3 项目所用指令时序2.3.1 WREN&#xff08;06h&#xff09;2.3.2 RDID&#xff08;9Fh&#xff09;2.3.3 READ&#xff08;…

什么是著作权?对此你了解多少?(二)

上一篇&#xff0c;已经为大家介绍了著作权的概念、著作权的分类以及著作权的内容等相关基础性认识。那么著作权如何取得呢&#xff1f; 我国采取的自动取得原则&#xff0c;当作品创作完成后&#xff0c;只要符合法律上作品的条件&#xff0c;著作权就产生了。著作权人可以申请…

百分点科技受邀参加“一带一路”国际合作高峰论坛

10月17-18日&#xff0c;第三届“一带一路”国际合作高峰论坛在北京成功举行。作为新一代信息技术出海企业代表&#xff0c;百分点科技董事长兼CEO苏萌受邀出席高峰论坛开场活动——“一带一路”企业家大会&#xff0c;与来自82个国家和地区的企业或机构、有关国际组织、经济机…

ArmSoM-W3之RK3588 MPP环境配置

1. 简介 瑞芯微提供的媒体处理软件平台&#xff08;Media Process Platform&#xff0c;简称 MPP&#xff09;是适用于瑞芯微芯片系列的 通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理&#xff0c;其目的是为了屏蔽不 同芯片的差异&#xff0c;为使用者…

el-input: 把不符合正则校验的值动态清空,只保留符合的值

<el-input v-model"form.profit" placeholder"请输入授权专利新增利润" input"handleInput" clearable />/*** 不符合正则校验,清空*/const handleInput () > {if (form.value.profit) {if (!/^\d*\.?\d*$/.test(form.value.profit))…

Error- Loaded runtime CuDNN library: 8.0.4 but source was compiled with: 8.1.0.

运行tensorflow2.5训练代码之后会出现如下报错&#xff1a; Loaded runtime CuDNN library: 8.0.4 but source was compiled with: 8.1.0. CuDNN library needs to have matching major version and equal or higher minor version. If using a binary install, upgrade your…

es6(三)——常用es6(函数、数组、对象的扩展)

ES6的系列文章目录 第一章 Python 机器学习入门之pandas的使用 文章目录 ES6的系列文章目录0、数值的扩展一、函数的扩展1、函数的默认值2、函数的reset参数 二、数组的扩展1. 将对象转成数组的Array.from()2. 将对象转成数组的Array.from()3. 实例方法 find()&#xff0c;fin…