每日一题:LeetCode-1089. 复写零

每日一题系列(day 09)

前言:

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

   🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,拾取经验,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️


题目:

  给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
  注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西

示例:

在这里插入图片描述

提示:

  • 1 <= arr.length <= 104
  • 0 <= arr[i] <= 9

思路:

  如果自己尝试写的时候发现其实并不简单,虽然被力扣标为简单。题目说遇到0要复写,把0后面的元素全部向后移动一位,留下一个位置给复写的0,而且只能在本数组内操作,不能扩容。在上到题目中我们说了,这种类似的问题都是可以使用双指针来解决。如何使用双指针就成了问题。

  虽然这题是让我们在原数组操作,但是我们不妨先开辟一个数组,cur指针指向原数组,dest指针指向新数组,只要cur不为0,dest就复制cur的值,如果cur为0,dest就移动两步,且每一步都写为0。

在这里插入图片描述

  这个时候我们发现dest指针所在数组与测试用例的结果相同,说明我们的思路是正确的,但是题目要求我们是原地操作。

  首如果我们按照常规的思路,首先设置cur指针用来遍历数组,同时表示dest指针走几步,因为开始不知道dest走几步,所以将dest的值设置为-1。

在这里插入图片描述

  既然我们从左向右的双指针不得行,我们可以考虑从右向左来进行复写操作,但是我们要想保证复写的正确性,还需要知道正向复写最后一个复写的元素,这样才能从后向前复写。
  其实我们在最开始假设有新数组来复写的操作,我们可以看到最后一个复写的值为4,最后dest和cur又都多走了一步,我们仅需将条件控制为:

dest <= arr.size() - 1;

即可,这样cur就会指向最后一个需要复写的元素了,dest也正好指向最后一个元素。而对于原地操作,我们仅仅需要找到cur的位置和dest的位置就行,所以在找位置的情况我们不需要复写,就可以在同一个数组操作了。

在这里插入图片描述

  这个时候,我们的cur的位置就是最后需要复写的位置,而dest正是我们需要复写的最后一个元素。
  找到这个元素之后,我们就可进行从后往前的复写操作了,当arr[cur]不为0的时候,dest向前移动一位并且复写这个数,cur–。如果cur为0,dest就向前走两位,每位复写为0,cur–。即可

代码实现:

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur = 0;
        int dest = -1;
        while(cur < arr.size())
        {
            if(arr[cur]) 
            dest++;
            else
            dest += 2;
            if(dest >= arr.size() - 1) break;
            cur++;
        }
        while(dest > -1)
        {
            if(arr[cur]) arr[dest--] = arr[cur--];//cur不为0拷贝一次
            else 
            {
                arr[dest--] = 0;//cur为0复写两次
                arr[dest--] = 0;
                cur--;
            }
        }
    }
};

但是这个时候我们运行的时候却发现:

在这里插入图片描述
出现了这么的错误,我们可以看到他给我们的报错的测试用例:

在这里插入图片描述
  我们不妨画图看一下问题在哪?

在这里插入图片描述
  原来是我们的dest指针越界了,在我们复写的时候这种情况会在数组外边越界访问了,这种情况是造成的原因是最后一个复写元素为0的原因。
  如果不考虑越界的情况继续复写一步操作我们会发现:

在这里插入图片描述
  所以其实我们仅仅需要控制住边界条件,复写时将:

arr[arr.size() - 1] = 0;

即可。所以我们可以这样改:

代码实现:

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur = 0;
        int dest = -1;
        while(cur < arr.size())
        {
            if(arr[cur]) 
            dest++;
            else
            dest += 2;
            if(dest >= arr.size() - 1) break;
            cur++;
        }
        if(dest == arr.size())//加上边界判断即可
        {
            arr[arr.size() - 1] = 0;
            dest -= 2;
            cur--;
        }
        while(dest > -1)
        {
            if(arr[cur]) arr[dest--] = arr[cur--];
            else 
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }
    }
};

在这里插入图片描述


  这样我们就可以通过了,这题虽然被标记为简单,但是我感觉却一点也不简单(主要是太菜),需要注意的是双指针的灵活运用,以及边界情况的考量要到位。

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

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

相关文章

Linux:服务器管理工具宝塔(bt)安装教程

一、简介 bt宝塔Linux面板是提升运维效率的服务器管理软件&#xff0c;支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等多项服务的管理功能 二、安装 使用 SSH 连接工具&#xff0c;如堡塔SSH终端连接到您的 Linux 服务器后&#xff0c;挂载磁盘&#xff0c;根据系统执…

微信如何单独隐藏某个人的聊天记录?

微信&#xff0c;如今已成为我们生活中不可或缺的沟通工具&#xff0c;它的应用范围涵盖了工作、学习及日常生活的方方面面。然而&#xff0c;有时为了保护个人隐私&#xff0c;或是不愿让他人看到特定对话&#xff0c;我们需要对与某人的聊天记录进行隐藏。那么&#xff0c;微…

【已解决】如何打开设置了密码的7Z压缩文件?

7Z是一种常见的压缩文件格式&#xff0c;相比RAR和ZIP格式&#xff0c;它的压缩率更高&#xff0c;可以压缩出更小的文件体积&#xff0c;也同样可以设置密码保护&#xff0c;那设置了密码的7Z压缩文件要如何打开呢&#xff1f; 我们知道&#xff0c;7Z压缩文件设置密码保护后…

06-Git分支相关的命令,如创建/删除/切换分支

Git分支(副本) 在版本控制过程中需要同时推进多个任务,此时可以为每个任务创建单独分支即开一个一模一样的副本 ,最终分支开发完后再合并到主分支提高开发效率 使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时候不会影响主线分支的运…

Linux命令--根据端口号查看进程号(PID)

Linux命令–根据端口号查看进程号&#xff08;PID&#xff09; 查找8080端口对应的进程号: netstat -nlp|grep :8297对应的进程号1061,如果想杀掉此进程&#xff0c;可以用一下命令&#xff1a; kill -9 1061

2023年中国金融租赁行业研究报告

第一章 行业概况 1.1 定义 金融租赁是一种融资方式&#xff0c;其中租赁公司&#xff08;出租人&#xff09;为企业&#xff08;承租人&#xff09;购买所需设备&#xff0c;并在租赁期内由承租人使用。承租人负责支付租金&#xff0c;租赁期满后有权选择退租、续租或购买设备…

Java中重载和重写的区别

1.重写(Override) 从字面上看&#xff0c;重写就是重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法&#xff0c;但有时子类并不想原封不动的继承父类中的某个方法&#xff0c;所以在方法名&#xff0c;参数列表&#xff0c;返回类型…

【机器学习】集成学习算法之AdaBoost

文章目录 基本步骤示例生成第 1 棵决策树生产第 2 棵决策树生成第 T 棵决策树加权投票 sklearn 实现 基本步骤 首先&#xff0c;是初始化训练数据的权值分布 D 1 D_1 D1​。假设有 m m m 个训练样本数据&#xff0c;则每一个训练样本最开始时&#xff0c;都被赋予相同的权值…

爬虫从入门到精通(21) |字体加密通杀方案

文章目录 一、了解什么是字体加密二、Python打开字体加密文件三、字体加密的通杀1.静态的字体文件固定顺序的字体2.其他动态变化情况 一、了解什么是字体加密 字体加密是页面和前端字体文件想配合完成的一个反爬策略。通过css对其中一些重要数据进行加密&#xff0c;使我们在代…

启用Android放大镜功能,事半功倍,可惜该功能只存在于Android 14

安卓屏幕放大镜是一种无障碍功能&#xff0c;旨在通过放大屏幕上显示的内容来帮助任何有视力障碍的人。这是安卓提供的几个功能之一&#xff0c;旨在使智能手机更具包容性和用户友好性。 如果你曾经想知道如何在你的安卓手机上设置并充分利用屏幕放大镜&#xff0c;那么你就来…

索尼mxf覆盖部分恢复案例(索尼PMW-580)

索尼mxf覆盖部分恢复案例(索尼PMW-580) 索尼的摄像机型号是比较繁多的&#xff0c;高端系列基本上是以mxf文件为主&#xff0c;这一类案例之前处理不少&#xff0c;今天我们看一个索尼pmw-580摄像机删除后又覆盖的恢复案例。 故障存储:64G SD卡/Exfat文件系统 故障现象: 拍…

Java核心知识点整理大全25-笔记

目录 25. Hadoop 25.1.1. 概念 25.1.2. HDFS 25.1.2.1. Client 25.1.2.2. NameNode 25.1.2.3. Secondary NameNode 25.1.2.4. DataNode 25.1.3. MapReduce 25.1.3.1. Client 25.1.3.2. JobTracker 25.1.3.3. TaskTracker 25.1.3.4. Task 25.1.3.5. Reduce Task 执行…

理解Gamma传递函数

对于任何认真从事色彩工作或电影和电视母带处理的人来说&#xff0c;掌握Gamma编码是一项重要的知识&#xff0c;但它也可能是最令人困惑的主题之一&#xff0c;因为我们人类的视力与大多数电子设备的工作方式截然不同。 Gamma编码和传递函数的全部工作都是基于向我们的人眼提供…

【深度学习】gan网络原理生成对抗网络

【深度学习】gan网络原理生成对抗网络 GAN的基本思想源自博弈论你的二人零和博弈&#xff0c;由一个生成器和一个判别器构成&#xff0c;通过对抗学习的方式训练&#xff0c;目的是估测数据样本的潜在分布并生成新的数据样本。 1.下载数据并对数据进行规范 transform tran…

用Python进行gRPC接口测试(一)

前言 gRPC 是一个高性能、通用的开源RPC框架&#xff0c;其由 Google 主要面向移动应用开发并基于HTTP/2 协议标准而设计&#xff0c;基于 ProtoBuf(Protocol Buffers) 序列化协议开发&#xff0c;且支持众多开发语言。 自gRPC推出以来&#xff0c;已经广泛应用于各种服务之中…

UI自动化测试工具有哪些优势?

UI自动化测试工具通过提高测试效率、覆盖率&#xff0c;减少测试时间和成本&#xff0c;以及支持持续集成等方式&#xff0c;为软件开发团队提供了一系列重要的优势&#xff0c;有助于提升软件质量和开发效率。 自动化执行&#xff1a;UI自动化测试工具可以模拟用户与应用程序的…

ubuntu22下使用nvidia 2080T显卡部署pytorch

1.直接到NVIDA官网下载相应的驱动&#xff0c;然后安装官方驱动 | NVIDIA 2.下载相应版本cuda&#xff0c;并安装&#xff0c;安装时不安装驱动 3.conda install pytorch2.1.0 torchvision0.16.0 torchaudio2.1.0 pytorch-cuda12.1 -c pytorch -c nvidia 安装pytorch。 安装…

Qt应用开发--国产工业开发板全志T113-i的部署教程

Qt在工业上的使用场景包括工业自动化、嵌入式系统、汽车行业、航空航天、医疗设备、制造业和物联网应用。Qt被用来开发工业设备的用户界面、控制系统、嵌入式应用和其他工业应用&#xff0c;因其跨平台性和丰富的功能而备受青睐。 Qt能够为工业领域带来什么好处&#xff1a; -…

scratch《贪吃蛇》改编版——设计方案

一、设计思路 设计想法来自《贪吃蛇》游戏改编。《贪吃蛇》游戏的背景源自古老的瑞典神话&#xff0c;讲述一条巨蛇在世间蔓延&#xff0c;吞噬一切的传说。游戏的玩法很简单&#xff0c;玩家通过上下左右键控制蛇的方向&#xff0c;使其在地图上移动并吞噬食物&#xff0c;随…

Android 12 及以上授权精确位置和模糊位置

请求位置信息权限 为了保护用户隐私&#xff0c;使用位置信息服务的应用必须请求位置权限。 请求位置权限时&#xff0c;请遵循与请求任何其他运行时权限相同的最佳做法。请求位置权限时的一个重要区别在于&#xff0c;系统中包含与位置相关的多项权限。具体请求哪项权限以及…