当前位置: 首页 > news >正文

【C++算法】2.双指针_复写零

文章目录

    • 题目链接:
    • 题目描述:
    • 解法-双指针算法
    • C++ 算法代码:
    • 图解:


题目链接:

1089.复写零


题目描述:

c9b4c49b38e6e14c85c33561d594e4a6


解法-双指针算法

根据“异地操作”优化为“就地操作”。

异地操作是指:原来我们是创立一个新数组,然后设置两个指针curdestcur指向0的时候,dest复写一次,直到结束。

a4875ee714bf02d9905df24062775346

因为这里不准建立新的数组,只能就地更改,所以是就地操作。

  1. 我们要先找到最后一个复写的数。(也可以用双指针算法)

    cur指向的位置不是0,那么dest向后移动1位,cur指向的位置是0,那么dest向后移动2位,每次移动后检查dest有没有越界。然后cur++

f16f9a2678ede70dd6cb4a90c4150c43

但是要注意,上面的算法看似天衣无缝,实际上有问题。

比如:[1,0,2,3,0,4]

变成:[1,0,0,2,3,0]

cur指向3的时候,dest指向0,然后下一步cur指向0dest要往后面移动2次。但是这样就越界了。

  1. 所以我们要处理一下边界情况。

  2. 从后向前完成复写工作。


C++ 算法代码:

class Solution 
{
public:void duplicateZeros(vector<int>& arr){// 1. 先找到最后一个数int cur = 0, dest = -1, n = arr.size();//cur指向最后一个数,dest指向最后一个复写的数while(cur < n){if(arr[cur]){//cur不为0,dest移动1步dest++;}else{//cur为0,dest移动2步dest += 2;}if(dest >= n - 1) {//dest到最后或者越界就退出循环break;}cur++;//继续往后找}// 2. 处理一下边界情况if(dest == n){arr[n - 1] = 0;cur--; //cur向前移动1步dest -= 2;//dest向前移动2步}// 3. 从后向前完成复写操作while(cur >= 0){if(arr[cur]){arr[dest--] = arr[cur--];}else{arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
};

图解:

  1. 开始

0e31050dd32cc758aadba14a5cddbf5d

  1. 经过while循环后

b4f51c51e1f0b4f65aac3453dc8ef8a2

  1. 这个时候是越界了,执行条件2
arr[n - 1] = 0;
cur--; //cur向前移动1步
dest -= 2;//dest向前移动2步
  1. 执行完2

ddc36c83c59966dff58db269bb596cc8

  1. cur刚好指向最后一个复写的数,然后执行步骤 3。因为arr[cur]不为0,所以arr[dest--] = arr[cur--];

c39244fc86600d5523bc8331b6618397

  1. 因为arr[cur]不为0,所以arr[dest--] = arr[cur--];

6ff01fa38f35f662372bf6fda7f0eaff

  1. 因为arr[cur]0,所以arr[dest--] = 0;arr[dest--] = 0;cur--;

3222c95a09467fa776fddf4bc678ed09

  1. 因为arr[cur]不为0,所以arr[dest--] = arr[cur--];

9481d74d15f409f5cf6618a44b49198a

此时cur<0,不符合循环条件。循环结束。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深入理解 CompletableFuture 的底层原理
  • 计算机视觉硬件整理(四):相机与镜头参数介绍
  • 【Kubernetes】常见面试题汇总(三十四)
  • python的逻辑控制
  • 高刷显示器哪个好?540Hz才有资格称高刷
  • 重修设计模式-行为型-责任链模式
  • 【玩转贪心算法专题】738. 单调递增的数字【中等】
  • 硬件设计很简单?合宙低功耗4G模组Air780E—开机启动及外围电路设计
  • 文件上传js代码
  • 华为认证HCIA篇--网络通信基础
  • JavaScript中if嵌套assert的方法
  • 【python append函数的一些细节】
  • 初步认识了解分布式系统
  • 货拉拉高级大数据平台算法工程师社招一面
  • 服务器数据恢复—SAN环境下LUN映射出错导致文件系统一致性出错的数据恢复案例
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • docker-consul
  • ES6系统学习----从Apollo Client看解构赋值
  • HashMap ConcurrentHashMap
  • Java深入 - 深入理解Java集合
  • Laravel5.4 Queues队列学习
  • Node 版本管理
  • npx命令介绍
  • React 快速上手 - 07 前端路由 react-router
  • Vue.js 移动端适配之 vw 解决方案
  • 将回调地狱按在地上摩擦的Promise
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 微信公众号开发小记——5.python微信红包
  • 我的面试准备过程--容器(更新中)
  • 我看到的前端
  • 写给高年级小学生看的《Bash 指南》
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • # 计算机视觉入门
  • #define、const、typedef的差别
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (11)iptables-仅开放指定ip访问指定端口
  • (160)时序收敛--->(10)时序收敛十
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)计算机毕业设计ssm电影分享网站
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)基于IDEA的JAVA基础10
  • .net 调用php,php 调用.net com组件 --
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NetCore部署微服务(二)
  • .NET导入Excel数据
  • .NET基础篇——反射的奥妙
  • .php结尾的域名,【php】php正则截取url中域名后的内容