【优选算法】模拟

在这里插入图片描述

目录

  • 一、[替换所有的问号](https://leetcode.cn/problems/replace-all-s-to-avoid-consecutive-repeating-characters/description/)
  • 二、[提莫攻击](https://leetcode.cn/problems/teemo-attacking/description/)
  • 三、[Z 字形变换](https://leetcode.cn/problems/zigzag-conversion/description/)
  • 四、[外观数列](https://leetcode.cn/problems/count-and-say/description/)
  • 五、[数青蛙](https://leetcode.cn/problems/minimum-number-of-frogs-croaking/description/)
  • 结尾

一、替换所有的问号

题目描述
在这里插入图片描述

思路讲解
本题的可以使用模拟算法来解决本题,模拟算法就依葫芦画瓢,思路比较简单,但是比较考验代码能力。

对题目进行解释就是在数组中找到每一个?,将这个?变为26个小写字母中的任意一个,但是它不能与左右两边的字母相同,例如:a?b中的?只要不变为a/b中的其中一个,就可以变为除a和b以外的其他任意的小写字母。需要注意两个特别的位置,数组的开头和结尾,数组的开头位置左边没有数据,数组的结尾位置右边没有数据,需要对这两个位置进行特殊处理。

编写代码

class Solution {
public:string modifyString(string s) {int sLen = s.size();for(int i = 0 ; i <= sLen - 1; i++){if(s[i] == '?'){for(int ch = 'a' ; ch <= 'z' ;ch++){if((i == 0 || s[i - 1] != ch) && (i == sLen - 1 || s[i + 1] != ch) ){s[i] = ch;break;}}}}return s;}
};

二、提莫攻击

题目描述
在这里插入图片描述

思路讲解
本题同样是使用模拟算法来解决,提莫对艾希进行攻击后,艾希会进入长达duration秒的中毒状态,当在艾希处于中毒状态的期间继续攻击,那么艾希的中毒时间会被重置,继续中毒duration秒。例如:艾希在1秒的时候进入中毒状态,中毒状态持续时间duration为2秒,则艾希在第三秒时就会解除中毒状态,但是若提莫在第二秒时继续攻击艾希,那么艾希的中毒时间被重置,从第二秒开始中毒2秒,则艾希在第四秒时就会解除中毒状态。

通过上面的描述我们可以得知,当提莫两次攻击的时间(t1,t2)差大于等于中毒持续时间(duration),则艾希的第一次中毒时间会持续duration秒,反之当提莫两次攻击的时间差大于等于中毒持续时间(duration),则艾希的第一次中毒时间会持续t1 - t2秒。需要注意的是提莫最后一次攻击后,艾希的中毒状态必定有duration秒。接下来就可以将思路转化为代码了。

编写代码

class Solution {
public:int findPoisonedDuration(vector<int>& timeSeries, int duration) {int ans = 0;int timeSeriesLen = timeSeries.size();for(int i = 1 ; i < timeSeriesLen ;i++){if(timeSeries[i] - timeSeries[i-1] < duration){ans += timeSeries[i] - timeSeries[i-1];}else{ans += duration;}}// 最后一个攻击后必定中毒duration秒ans += duration;return ans;}
};

三、Z 字形变换

题目描述
在这里插入图片描述

思路讲解
本题同样是使用模拟算法来解决,将题目给的字符串,以从上往下、从左到右进行 Z 字形排列,说是Z字形但是看起来却像N字形。

以下图为例,我们可以创建一个n行len列的二位数组(这里的len是字符串的长度,实际上可能并不需要这么长,大家可以找一个方法来计算出len的大小),按照特定的方法将字符串中放到二维数组中,再一行一行的遍历,组成新的字符串返回即可。但是这样本题的复杂度为:时间复杂度O(n * len) + 空间复杂度O(n * len),并不是一个很好的解决方案。
在这里插入图片描述

我们根据上面的解法进行优化,我们不将字符串放入二维数组中,而是将字符串每个字符的下标放入二维数组进行观察,仔细观察每一行,发现第0行中每一个数相差6也就是2n-2,我们设公差d=2n-2,同样第n-1行每一个数相差的也是2n-2,再看中间几行,以每两个数为一组,第一组的两个下标相加等于公差d,后面每一组下标都是在前一组对应数的基础上加上公差d,通过这里的描述就可以得出下面的结论。

  1. 第0行:0 --> 0+d --> 0+2d --> ... -> 0 + xd
  2. 第k行:{k,d-k} --> {k+d,d-k+d} --> {k+2d,d-k+2d} -> ... --> {k+xd,d-k+xd}
  3. 第n-1行:n-1 --> n-1+d --> n-1+2d --> ... -> n-1 + xd

在这里插入图片描述
然后再测试其他行的情况,发现上面的结论同样适用,除了只有n=1的情况,n=1时公差d=0,会导致代码陷入死循环,需要特殊处理。总结出上面的规律后,实际上这个二维数组就不用定义了,可以使用上面这个结论来解决本题。

编写代码

class Solution {
public:string convert(string s, int numRows) {if(numRows == 1)return s;string ans;int sLen = s.size();int d = 2 * numRows - 2;  // 公差,寻找下一个字母需要移动的位置// 第一行for(int i = 0 ; i < sLen ; i += d)ans += s[i];for(int i = 1 ; i < numRows - 1;i++){for(int num1 = i , num2 = d - i ; num1 < sLen ; num1 +=d , num2 += d){ans += s[num1];if(num2 < sLen)ans += s[num2];}            }// 最后一行for(int i = numRows-1 ; i < sLen ; i += d)ans += s[i];return ans;}
};

四、外观数列

题目描述
在这里插入图片描述

思路讲解
本题的解题思路依旧是模拟,将题目内容转换为下图,那么本题的就可以使用双指针遍历字符串,记录每一段的数字和相同数字的个数并添加到一个新的字符串即可解决本题。
在这里插入图片描述

编写代码

class Solution {
public:string countAndSay(int n) {string ans("1");int left = 0 , right = 0;int count = 0; // 记录连续相同数字的个数while(--n){string tmp;while(right < ans.size()){while(right < ans.size() && ans[left] == ans[right]){count++;right++;}tmp += (count + '0');tmp += ans[left];count = 0;left = right;}left = right = 0;ans = tmp;}return ans;}
};

五、数青蛙

题目描述
在这里插入图片描述

思路讲解
本题的解题思路依旧是模拟,本题需要得到模拟字符串中所有蛙鸣所需不同青蛙的最少数目,从上面题目示例的演示可以得到,当一个青蛙叫完后可以继续叫,当没有青蛙处于叫完状态并且还继续需要蛙叫时,就需要增加新的青蛙了。

这里我们定义一个哈希表(这里可以使用数组)来记录处于每种字符下青蛙的个数,接下来对遍历到某个字符时,进行处理的方法进行分类讨论。

  1. 当遍历到r、o、a、k时,查看前一个字符下有多少个青蛙,若为非0,则将前一个字符中的一个青蛙放到当前字符下,若为0,说明给出的字符串不是 “croak” 的有效组合,返回-1。
  2. 当遍历到c时,查看字符k下有多少个青蛙,字符k下的青蛙个数代表已经叫完青蛙的个数,也就是可以重新开始叫的青蛙的个数,若为非0,则将字符k中的一个青蛙放到字符c中重新开始叫,若为0,则说明需要新的青蛙,引入一个新的青蛙放到字符c中即可。

当字符串遍历完后,再遍历一下哈希表,查看字符c、r、o、a下的青蛙是否为0,为非0,说明给出的字符串不是 “croak” 的有效组合,返回-1,为0说明给出的字符串是 “croak” 的有效组合,返回字符k下的青蛙个数即可。

编写代码

class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {unordered_map<int,int> um;int count = 0;for(int i = 0 ; i < croakOfFrogs.size() ; i++){// k为0则说明没有已经叫完的蛙// 那么需要有一只新的蛙if(croakOfFrogs[i] == 'c'){if(um['k'] != 0)um['k']--;elsecount++;um['c']++;}// 若前面有蛙叫出了c,那么这里继续叫r// 且叫c的蛙要少一个,叫r的蛙多一个// 否则则出错返回-1else if(croakOfFrogs[i] == 'r'){if(um['c'] != 0){um['c']--;um['r']++;}else{return -1;}}else if(croakOfFrogs[i] == 'o'){if(um['r'] != 0){um['r']--;um['o']++;}else{return -1;}}else if(croakOfFrogs[i] == 'a'){if(um['o'] != 0){um['o']--;um['a']++;}else{return -1;}}else // croakOfFrogs[i] == 'k'{if(um['a'] != 0){um['a']--;um['k']++;}else{return -1;}}}// 叫完后,所有的蛙必须是叫完k// 若其他叫声中还有蛙,则说明无效,返回-1if(um['c'] || um['r'] || um['o'] || um['a'])return -1;return count;}
};

结尾

如果有什么建议和疑问,或是有什么错误,大家可以在评论区中提出。
希望大家以后也能和我一起进步!!🌹🌹
如果这篇文章对你有用的话,希望大家给一个三连支持一下!!🌹🌹

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas | 检查布尔序列函数any() 和 all()的区别

在 Python 中使用 pandas 库时&#xff0c;.any() 和 .all() 是两个用于检查布尔序列&#xff08;如 pandas 的 Series&#xff09;的函数&#xff0c;它们的行为和用途有所不同&#xff1a; 通常用于检查两列元素是否一致或者个别一致的情况 .any(): .any() 函数用于检查序列…

关于HTTP DEBUGGER PRO的DURATION列一点理解

最近在排查一个网络问题的时候&#xff0c;使用了HTTP DEBUGGER PRO进行抓包。发现HTTP DEBUGGER PRO抓包显示的DURATION列的耗时不太对劲&#xff0c;于是排查完网络问题就去看了下这个DURATION列实际所指的耗时&#xff0c;就有了这篇文章。 使用POSTMAN对https://www.rust-l…

Mysql数据库基础篇笔记

目录 sql语句 DDL——数据库定义语言&#xff08;定义库&#xff0c;表&#xff0c;字段&#xff09; 数据库操作&#xff1a; 表操作&#xff1a; DML 增删改语句 DQL 语法编写顺序&#xff1a; 条件查询 DCL 用户管理&#xff1a; 权限管理&#xff1a; 函数 常见字符串内置函…

联想按下“AI加速键”!目标:与5000万中小企业共创

根据相关数据显示&#xff0c;截至2023年末中国中小企业数量超过5300万家&#xff0c;中小企业支撑了中国经济的发展与前进。在AI大模型风潮到来之际&#xff0c;相比于AI带给大企业的长期价值&#xff0c;AI对中小企业有着更加直接、显著、决定性的意义。同时&#xff0c;AI与…

SpringBoot项目启动报错-Slf4j日志相关类找不到

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

SABO-CNN-BiGRU-Attention减法优化器优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比

SABO-CNN-BiGRU-Attention减法优化器优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 SABO-CNN-BiGRU-Attention减法优化器优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计参…

【Java基础】集合

目录 CollectionListSet *重点&#xff1a; 底层机制&#xff08;源码&#xff09;应用场景 好处&#xff1a; 数组&#xff08;长度不可改&#xff0c;同一类型&#xff0c;增删不便&#xff09;集合&#xff08;动态保存&#xff0c;多种类型&#xff0c;方便操作&#xf…

实验3-实时数据流处理-Flink

1.前期准备 &#xff08;1&#xff09;Flink基础环境安装 参考文章&#xff1a; 利用docker-compose来搭建flink集群-CSDN博客 显示为这样就成功了 &#xff08;2&#xff09;把docker&#xff0c;docker-compose&#xff0c;kafka集群安装配置好 参考文章&#xff1a; …

javaweb-Mybaits

1.Mybaits入门 &#xff08;1&#xff09;介绍 &#xff08;2&#xff09; 2.Mybaits VS JDBC 3.数据库连接池 &#xff08;1&#xff09;SpringBoot默认连接池为hikari&#xff0c;切换为Druid有两种方式 方式一&#xff1a;加依赖 方式二&#xff1a;直接修改配置文件 …

Mybatis 关联查询

在 MyBatis 中&#xff0c;关联查询&#xff08;也称为复杂映射&#xff09;是指将多个表的数据通过 SQL 查询和结果映射的方式&#xff0c;组合成一个或多个 Java 对象。这种查询方式用于处理实体之间的关系&#xff0c;如一对一、一对多和多对多关系。通过关联查询&#xff0…

GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

分布式光伏电站如何实现监控及集中运维管理?

安科瑞戴婷 Acrel-Fanny 前言 今年以来&#xff0c;在政策利好推动下光伏、风力发电、电化学储能及抽水蓄能等新能源行业发展迅速&#xff0c;装机容量均大幅度增长&#xff0c;新能源发电已经成为新型电力系统重要的组成部分&#xff0c;同时这也导致新型电力系统比传统的电…

大模型分类1—按应用类型

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl根据应用领域,大模型可分为自然语言处理、计算机视觉和多模态大模型。 1. 自然语言处理大模型(NLP) 1.1 应用领域与技术架构 自然语言处理大模型(NLP)的应用领域广泛,包括但不限于文本分类、…

2024 32kstar 的目前最佳开源RAG框架之一的 Langchain-Chatchat开源项目实践(一)

2024 32kstar 的目前最佳开源RAG框架之一的 Langchain-Chatchat开源项目实践&#xff08;一&#xff09; 文章目录 2024 32kstar 的目前最佳开源RAG框架之一的 Langchain-Chatchat开源项目实践&#xff08;一&#xff09;一、前言二、实践步骤1、软硬件要求&#xff08;1&#…

网络安全应急响应流程图

一、网络安全应急响应建设的背景和现状 当前&#xff0c;许多地区和单位已经初步建立了网络安全预警机制&#xff0c;实现了对一般网络安全事件的预警和处置。但是&#xff0c;由于网络与信息安全技术起步相对较晚&#xff0c;发展时间较短&#xff0c;与其他行业领域相比&…

2024 阿里云Debian12.8安装apach2【图文讲解】

1. 更新系统&#xff0c;确保您的系统软件包是最新的 sudo apt update sudo apt upgrade -y 2. 安装 Apache Web 服务器 apt install apache2 -y 3. 安装 PHP 及常用的扩展 apt install php libapache2-mod-php -y apt install php-mysql php-xml php-mbstring php-curl php…

本地windows环境下,在vscode里将go项目打成docker镜像,并运行访问

此处只展示一个简单go代码实例. #前提:需要装好docker和golang环境,本地docker启动且配置好镜像源地址: # 容器镜像加速服务-云港网络 1.首先在vscode中写一个简单输出的demo go mod init &#xff0b;go mod tidy编译一下,命令运行如下: 2.使用命令生成Dockerfile文件 $ g…

GIT的使用方法以及汉化方法

1.下载git软件&#xff0c;可以从官网下载 下载后默认安装即可。 2.找到一个文件夹&#xff0c;或者直接打开gitbash gitbash可以使用cd指令切换目录的 打开后输入 git clone https:[git仓库的网页]即可克隆仓库 就是这个地址 克隆后即可使用代码 如果忘记了命令可以使用 -…

前缀和(四)除自身以外数组的乘积

238. 除自身以外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&…

图解RabbitMQ七种工作模式生产者消费者模型的补充

文章目录 1.消费者模型2.生产者-消费者模型注意事项2.1资源释放顺序问题2.2消费者的声明问题2.3虚拟机和用户的权限问题 3.七种工作模式3.1简单模式3.2工作模式3.3发布/订阅模式3.4路由模式3.5通配符模式3.6RPC通信3.7发布确认 1.消费者模型 之前学习的这个消息队列的快速上手…