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

双指针算法(2)——复写零

双指针算法

定义两个指针,让后面的指针在数组中遍历,前面的指针先不动,符合题目要求时,让两个指针的数据进行交互,直到后面的指针走到数组结尾。

 题目:

这个题,如果我们用两个数组下标去标记,一个遍历,一个交互(赋值),就会造成下面的结果

第一次复写时,发现数据已经被覆盖掉了,所以不可取。

其实,从前向后不行,从后向前可以,我们通过结果直到,数组的最后一个是4.

先让dest指向n-1。cur指向最后一个复写的数(4),然后判断,如果cur的值不为0,那么dest=cur,cur--,dest--;如果等于0,dest=0,dest-1=0,然后cur--,dest--。直到cur走到数组最开始。

现在问题就来到了,我们怎么找到哪个是复写的最后一个数?

这次我们就需要从前向后遍历了

cur指向0位置,dest指向-1.判断cur,不为0,dest++,如果dest++后不是在结尾,则cur++;为0,dest+=2,如果dest++后不是在结尾,则cur++。直到dest走到数组最后一个数字,此时cur就是复写的最后一个数。

但也有特殊情况比如:[1,0,2,3,0,4]。

我们走着走着发现dest突然越界了。dest访问到了n。

解决方法:我们发现出现这种错误的cur最后指向的一定是0,所以我们先让n-1等于0,然后,dest-=2,cur--。

最终代码如下:

void Solution(vector <int>&arr)
{int cur=0;  int dest=-1;int 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;cur--;dest-=2;}//从后向前复写while(cur>=0){if(arr[cur]) {arr[dest]=arr[cur];cur--;dest--;}else{arr[dest--]=0;arr[dest--]=0;cur--;}}
}

http://www.xdnf.cn/news/2528.html

相关文章:

  • GAMES202-高质量实时渲染(Real-Time Shadows)
  • STM32 CAN通信 HAL库实战教程:从零到测试成功
  • 【计算机网络分类全解析】从局域网到广域网的工程实践
  • 【三大特性】虚表 内存分布
  • Marmoset Toolbag 5.0 中文汉化版 八猴软件中文汉化版 免费下载
  • C# 类(Class)教程
  • 浮点数:IEEE 754标准
  • PCIe 转 U.2 接双硬盘指南 - 超微(Supermicro)主板
  • Mysql如何高效的查询数据是否存在
  • 理解 Kubernetes 初始访问向量(一)——控制平面
  • 【Webpack \ Vite】多环境配置
  • makefile总结
  • 关于Spark知识点与代码测试的学习总结
  • 单片机 + 图像处理芯片 + TFT彩屏 复选框控件
  • 30-算法打卡-字符串-重复的子字符串-leetcode(459)-第三十天
  • 使用 Cherry Studio 调用高德 MCP 服务
  • NFS从零部署
  • 华为 CCE 查看节点剩余可调度cpu核数
  • 从零实现分布式WebSocket组件:设计模式深度实践指南
  • 路由协议基础
  • babel和loader的关系
  • 微深节能 平板小车运动监测与控制系统 格雷母线
  • LeetCode题解1297. 子串的最大出现次数
  • 低压电工常见知识点
  • 麒麟系统通过 Service 启动 JAR 包的完整指南
  • 【KWDB 创作者计划】_KWDB引领数据库技术革新的璀璨之星
  • 业务校验工具包-validate-utils介绍
  • spring-rabbit的CachingConnectionFactory默认参数导致消费者Channel数量暴增问题解决
  • go语言八股文(三)
  • Deep Dark Sea 局域網文件共享即時匿名聊天去數據庫部署