Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >每日一练:【优先算法】双指针之复写零(easy)

每日一练:【优先算法】双指针之复写零(easy)

作者头像
ZLRRLZ
发布于 2024-12-13 12:10:23
发布于 2024-12-13 12:10:23
3800
代码可运行
举报
文章被收录于专栏:C语言C语言
运行总次数:0
代码可运行

1. 题目链接:1089. 复写零

2. 题目描述及分析

题目要求我们每遇到一个0,就复写一次,原数组中的元素往后移一位。对于这道题目,我们先忽略掉原地的要求。首先,我们来按照脑海中首先出现的异地的做法,我们通过原数组一指针判断数,另一个指针在新数组中完成对应复写操作。

我们发现大脑中首先出现的异地做法既简单又直接,在没有其他好的方法的情况下,那我们原地操作时是否可以模拟一下这种思路来解决问题呢?

3.算法原理

首先我们试试双指针正向走,但是我们很快发现,由于需要复写0,dest走的比src快,如果正向走,会覆盖掉数组中的非0数,因此正向走是行不通的。

既然dest走到比src快,那我们是否可以让dest先走呢?

我们观察题目,发现由于会复写0,新数组中的最后一个数在原数组中并不是最后一个数。这就意味着原数组中后几个数是可以抛弃的。我们上面提到由于dest与src走的速度不一致,我们需要让src先走,所以既然数组后面的几个数据可以抛弃,那么我们就让双指针从后往前开始走。

通过上图,我们知道我们的方法已经成功了,但是问题有回来了,为什么src指向的值是新数组中最后一个数呢?我们如何找到这个数呢?

我们回看我们一开始同向原地的操作,我们发现dest走快会导致覆盖原来的数据,但是如果我们不同过dest修改数组,我们发现dest与src走的流程是,跟异地的操作一摸一样的,这样当我们dest走到结尾,src指向的数据就是原地修改后数组的最后一个位置。

注:我们会遇到下图中的情况,模拟后dest会越界,这个需要我们手动仿照模拟的过程处理相关的值,并将dest移动到正确位置。

4.算法代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur = 0,dest = -1,n = arr.size();
        while(cur < n)
        {
            if(arr[cur])
            {
                dest++;
            }
            else
            {
                dest += 2;
            }
            if(dest >= n - 1)
            {
                break;
            }
            cur++;
        }
        if(dest >= n)
        {
            arr[n - 1] = 0;
            dest -= 2;
            cur--;
        }
        while(cur >= 0)
        {
            if(arr[cur])
            {
                arr[dest--] = arr[cur--];
            }
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
优先算法 —— 双指针系列 - 复写零
https://leetcode.cn/problems/duplicate-zeros/description/
迷迭所归处
2024/11/25
360
优先算法 —— 双指针系列 - 复写零
【优选算法】探索双指针之美(一):初识双指针
双指针顾名思义就是用两个指针相互配合来解决问题的。这两个指针可以在同一个数组或链表上,也可以在不同的数据结构上。它们既可以同时移动,也可以一快一慢。
_孙同学
2024/10/21
1190
【优选算法】探索双指针之美(一):初识双指针
[优选算法]——双指针——Leetcode——1089. 复写零
给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
小李很执着
2024/06/15
660
[优选算法]——双指针——Leetcode——1089. 复写零
【LeetCode刷题】:双指针篇(移动零、复写零)
大致题意就是将数组中所有为0的元素往后移,移到数组的末尾,但是所有的非零元素的顺序不能发生改变。例如:假设非零元素是1,2,3,4。那么移动完后的顺序依旧是1,2,3,4。
爱喝兽奶的熊孩子
2024/10/10
740
【LeetCode刷题】:双指针篇(移动零、复写零)
每日一题:LeetCode-1089. 复写零
   🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,拾取经验,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️
用户11029129
2024/06/04
1040
每日一题:LeetCode-1089. 复写零
初识算法 · 双指针(4)
本文是双指针算法的最后一文,以复写零和四数之和作为结束,介绍方式同样是题目解析,算法原理,算法编写三部曲,以下是题目的链接:
_lazy
2024/10/16
810
初识算法 · 双指针(4)
【c++算法篇】双指针(上)
处理好的区间,分为两个部分,左边为非零元素,右边全部为零,所以dest是一个分界线
用户11029103
2024/05/06
1190
【c++算法篇】双指针(上)
【算法一周目】双指针(1)
快慢指针:又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。
HZzzzzLu
2024/11/26
1270
【算法一周目】双指针(1)
【优先算法】专题——双指针
题目分析:题目说不要超过数组长度其实就是告诉我们不要越界,题目还告诉我们不能创建额外数组让我们就地修改原数组,我们不需要返回任何内容。
用户11375356
2024/11/25
1360
【优先算法】专题——双指针
LeetCode每日一题之 复写0
这种对数组元素进行修改,移动的题目我们仍然可以使用双指针法,不过我们按照常规思路从左到右处理数组,不难发现如下这种问题:
咬咬
2024/06/12
980
LeetCode每日一题之 复写0
双指针算法解决 移动零 和 复写零问题
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
初阶牛
2023/10/22
1770
双指针算法解决 移动零 和 复写零问题
【算法】双指针算法
一、题目分析 要将0放在所有数组的最后,而且非零元素的顺序保持不变,要求原地对数组进行移动。
zxctscl
2024/04/15
1190
【算法】双指针算法
我爱学算法之 —— 感受双指针带来的快感(一)
首先来学习 双指针 算法(这里通过一些习题,再实践中锻炼自己的思维,提升自己的算法能力)。
星辰与你
2024/11/26
900
我爱学算法之 —— 感受双指针带来的快感(一)
【C++】双指针算法
https://leetcode.cn/problems/duplicate-zeros/
风中的云彩
2025/03/04
540
【C++】双指针算法
02复写零
我们尝试在一个数组上面从左向右边复写,这样会把一个数覆盖住,从而导致连环错误。
用户11319080
2024/10/17
630
02复写零
双指针算法的妙用:提高代码效率的秘密(1)
从今天开始,小编将陆续分享一些算法题的解题思路和实现过程。为了提升未来的发展空间,也希望通过算法练习来增强自身能力。话不多说,下面进入算法时间!
用户11295429
2024/11/15
670
双指针算法的妙用:提高代码效率的秘密(1)
【算法专题】双指针
其实不单单是环形链表或者是数组,如果我们要研究的问题出现循环往复的情况时,均可考虑使⽤快慢指针的思想。快慢指针的实现方式有很多种,最常用的⼀种就是:
YoungMLet
2024/03/01
1370
【优选算法篇】双指针的优雅舞步:C++ 算法世界的浪漫探索
双指针方法是一种常见且高效的算法技巧,常用于数组和链表问题的优化解决。在这一篇博客中,我们将通过详细的讲解和题目解析,帮助大家理解双指针的基础用法及其应用场景。
半截诗
2024/10/14
1760
【优选算法篇】双指针的优雅舞步:C++ 算法世界的浪漫探索
【蓝桥杯】每天一题,理解逻辑(2/90)【LeetCode 复写零】
- 处理情况 - 让cur退一步,dest退两步,然后正常遍历 - 从后向前完成复写步操作
用户11367452
2025/03/06
560
【蓝桥杯】每天一题,理解逻辑(2/90)【LeetCode 复写零】
【优选算法篇】2----复写零
意思就是:一个数组长度是固定的,里面的元素,只要是0,就需要在原有的基础上,在0的后面多加一个0,以此类推,不为0的数就得往后移动,最后保持原有的数组长度不变,像上图第一个示例的5和0就是因为前面0要写两个,所以要被去掉~
用户11456817
2025/01/22
370
【优选算法篇】2----复写零
推荐阅读
相关推荐
优先算法 —— 双指针系列 - 复写零
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验