双指针_复写零

复写零

题目描述:

题目链接:复写零

内容:

这道题目要求我们每遇到一次0就复写一遍,并且只能在原数组上进行修改,不能越界访问。

算法原理:

思路1:

如果我们用两个指针cur,dest同时从指向第一个元素并从左往右遍历,cur指向元素为0,dest就让后面元素改为0。可想而知,后面的元素被覆盖掉了,又怎么继续复写呢?
 

那么我们可以从右往左复写。我们用cur指向最后一个复写的元素(eg1.中的4),dest指向数组最后一个元素。1.cur指向元素不为0,dest指向元素写成cur指向的元素并--。2.cur指向元素为0,dest指向元素写0并--,因为要复写0,所有再执行一次dest的操作。cur--进入循环,直到cur==dest。

那问题来了,怎么才能找到最后一个复写的元素呢?我们先让cur dest 都指向第一个元素前面,cur先++,根据cur是否为0来决定dest走一步还是两步。直到dest指向最后一个元素。

当然还有越界情况,最后一次dest++两次正好指向最后一个元素后面。这种情况就要特殊处理。(eg.[1,0,2,3,0,4] —>[1,0,0,2,3,0])让dest指向最后一个元素并改为0,cur dest再移向下一个元素继续循环就可以了。

1.利用双指针,cur指向最后一个复写元素,dest指向最后一个元素。(注意dest越界情况)

2.从右往左复写,cur指向0,dest修改2个元素为0。cur不为0,dest修改1个元素为cur指向的值。循环直到cur==dest (如果相等说明后面已经没有需要复写的0了)

代码实现:
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        //找cur位置
        int cur = -1, dest = -1;
        while (dest < (int)(arr.size() - 1)) 
        {
            cur++;
            if (arr[cur] == 0)
                dest += 2;
            else
                dest++;
        }
        //处理dest边界情况
        if (dest == arr.size()) 
        {
            arr[--dest] = 0;
            cur--;
            dest--;
        }
        //从右向左进行复写操作
        while (cur !=dest) 
        {
            if (arr[cur] == 0) 
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
            } 
            else 
            {
                arr[dest--] = arr[cur];
            }
            cur--;
        }
    }
};
注意点:

1.while (dest < (int)(arr.size() - 1))  因为dest类型为int arr.size()返回的类型为size_t,-1大于size_t的最大值,所有不强制转为int会导致不进入循环.

2.找cur位置时要先让cur指向第一个元素。再按照1.根据cur元素值dest++还是+=2。2.再判断dest是否小于(int)(arr.size() - 1)。3.cur++

思路2:

我们可以用vector函数pop_back insert进行复写0.

利用迭代器遍历数组,遇到0就尾删,并在0位置前插入0。

代码实现:
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        vector<int>::iterator it=arr.begin();
        while(it<arr.end())
        {
            if(*it==0)
            {
                arr.pop_back();
                arr.insert(it,0);
                it++;
            }
            it++;
        }
    }
};
注意点:

1.这里先删除在插入一般不会发生迭代器失效。arr.insert(it,0);这里不用it=arr.insert(it,0);接收返回值也可以。

2.insert是在it位置前插入元素,插入后it位置上的元素是新插入的0,it++后才指向原本的0。

3.it<arr.end() 如果最后一个元素为0的话,it++两次就会大于arr.end()。所以it!=arr.end()会出现越界访问。

总结:双指针问题从前往后不行就试试从后往前,多画图,总结总结规律,多调试几次就出来了。

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

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

相关文章

c# 输出二进制字符串

参考链接 C#二进制输出数据_c# 输出二进制 123.5的方法-CSDN博客https://blog.csdn.net/a497785609/article/details/4572112标准数字格式字符串 - .NET | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-strings#BFo…

工业HMI设计,稳定压倒一切,那高颜值就不稳定了吗?

提及工业HMI设计&#xff0c;很多小伙伴就跳出来说&#xff0c;工业 HMI稳定是最重要的&#xff0c;颜值没比必要&#xff0c;花里呼哨的.我承认稳定的重要性&#xff0c;但是稳定与颜值并不是一对矛盾体。本文就分享为什么工业HMI稳定性重要&#xff1f;为什么高颜值也重要&am…

QT:QML中使用Loader加载界面

目录 一.介绍 二.实现 三.效果展示 四.代码 一.介绍 在QML中使用Loader加载界面&#xff0c;可以带来诸多好处&#xff0c;如提高应用程序的启动速度、动态地改变界面内容、根据条件加载不同的组件、更有效地使用内存以及帮助分割应用逻辑等。 1.延迟加载&#xff1a;QML…

动态规划2:面试题 08.01. 三步问题

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;面试…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第34课-进门播放欢迎光临的音效

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第34课-进门播放欢迎光临的音效 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智…

R语言绘图 --- 柱状图(Biorplot 开发日志 --- 3)

「写在前面」 在科研数据分析中我们会重复地绘制一些图形&#xff0c;如果代码管理不当经常就会忘记之前绘图的代码。于是我计划开发一个 R 包&#xff08;Biorplot&#xff09;&#xff0c;用来管理自己 R 语言绘图的代码。本系列文章用于记录 Biorplot 包开发日志。 相关链接…

GITLAB常见问题总结

Troubleshooting GitLab Pages administration (FREE SELF) 原文地址 stage: Plan group: Knowledge info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/…

MWORKS车辆动力性经济性与热管理联合应用篇

一、引言 随着科技的飞速发展、环保意识的日益增强以及国家政策的大力支持&#xff0c;新能源汽车已经不再是遥不可及的未来科技&#xff0c;而是逐步走进千家万户&#xff0c;成为我们日常生活中不可或缺的一部分。然而&#xff0c;每到冬季的来临&#xff0c;纯电动汽车面临…

Linux shell编程学习笔记56:date命令——显示或设置系统时间与日期

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。在收集的信息中&#xff0c;应该有一条是搜索信息的时间。 1. date命令 的功能、格式和选项说明 我们可以使用命令 date --help 来查看 d…

巧用Jmeter Debug sampler获取变量信息

Jmeter Debug sampler介绍 Jmeter Debug sampler 可以帮助我们解决如下问题&#xff1a; debug参数化的变量取值是否正确 debug正则表达式提取器&#xff08;或json提取器&#xff09;提取的值是否正确 查看 JMeter 属性 具体使用方法 前提条件&#xff1a;添加查看结果树…

【Python】【matLab】模拟退火算法求二元高次函数最小值

一、目标函数 求二元高次函数的最小值。目标函数选择&#xff1a; 用于测试算法的简单的目标函数&#xff1a; 二、Python代码实现 import numpy as np# 目标函数&#xff08;2变量&#xff09; def objective_function(x):return x[0] ** 2 2 * x[0] - 15 4 * 4 * 2 * x[…

【开发心得】三步本地化部署llama3大模型

目录 第一步&#xff1a;启动ollama 第二步&#xff1a;启动dify 第三步&#xff1a;配置模型&#xff08;截图&#xff09; 最近llama3很火&#xff0c;本文追击热点&#xff0c;做一个本地化部署的尝试&#xff0c;结果还成功了&#xff01; 当然也是站在别人的肩膀上&…

DevOps中如何高效开展手工和自动化测试

在快速发展的软件开发行业中&#xff0c;DevOps实践已经成为提高软件交付速度和质量的关键。DevOps是一种文化和实践的集合&#xff0c;旨在促进开发&#xff08;Dev&#xff09;和运维&#xff08;Ops&#xff09;团队之间的协作和通信。测试作为DevOps生命周期中的重要组成部…

安装打开 ubuntu-22.04.3-LTS 报错 解决方案

安装打开 ubuntu-22.04.3-LTS 报错 解决方案 WslRegisterDistribution failed with error: 0x800701bc Error: 0x800701bc WSL 2 ??? https://aka.ms/wsl2kernel 1、确保【windows 功能】打开了【虚拟机】。 键盘上按 WIN R 打开【运行】&#xff0c;输入 【 control 】&…

树莓派4B 学习笔记2:GPIO介绍_第一个Python程序_点灯

今日开始学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; GPIO介绍_第一个Python程序_Python点灯 文章提供测试代码讲解、完整代码贴出、测试效果图 目录 树莓派4B 引脚与外设图&#xff1a; 树莓派常用命令&#xff1a; 第一个…

今日好料推荐(ARM嵌入式)

今日好料推荐&#xff08;ARM嵌入式&#xff09; 参考资料在文末获取&#xff0c;关注我&#xff0c;获取优质资源。 给我留言&#xff0c;会帮大家寻找需要的资料。 ARM 嵌入式系统 嵌入式系统在现代电子设备中扮演着至关重要的角色&#xff0c;从智能手机到工业自动化&am…

【网络技术】【Kali Linux】Wireshark嗅探(十六)TLS(传输层安全协议)报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

springboot undertow 文件上传文件过大异常

io.undertow.server.RequestTooBigException: UT000020 Connection terminated as request was larger than xxxx 修改yaml文件中关于undertow的配置项 server:undertow:# HTTP POST请求最大的大小# 默认0&#xff0c;无限制max-http-post-size: ${SERVER_UNDERTOW_MAX_HTTP_…

Jetson Nano集成探索大象机器人myAGV上的 SLAM 算法!

引言 大家好&#xff0c;最近新入手了一台myAGV JN这是elephant robotics在myAGV升级后的版本。最近有对SLAM相关知识感兴趣&#xff0c;想深入了解一些关于ROS中SLAM的一些算法和规划&#xff0c;跟据官方提供的gitbook&#xff0c;主要使用到了gmapping算法来建图导航实现功能…

计算机类专业应该怎么选学校和方向?优先选这些!

&#x1f446;点击关注 获取更多编程干货&#x1f446; 高考季临近&#xff0c;不少有意向报考计算机专业的同学在为院校和细分专业的选择而苦恼&#xff0c;以下是一些建议&#xff0c;希望能帮到大家&#xff01; 01 选校建议 在选择计算机科学&#xff08;CS&#xff09…