【优选算法必刷100题:专题六】(模拟算法)第039~343题:替换所有的问号、提莫攻击、Z 字形变换、外观数列、数青蛙

【优选算法必刷100题:专题六】(模拟算法)第039~343题:替换所有的问号、提莫攻击、Z 字形变换、外观数列、数青蛙

在这里插入图片描述


🎬 个人主页艾莉丝努力练剑
专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:

在这里插入图片描述

🎬艾莉丝的算法专栏简介:

在这里插入图片描述

文章目录


在这里插入图片描述

039 替换所有的问号

力扣链接:1576. 替换所有的问号

题目描述:

在这里插入图片描述

​1.1 解法:模拟的思想

纯模拟。从前往后遍历整个字符串,找到问号之后,就用a~z的每一个字符去尝试替换即可。

1.2 算法实现

// 模拟classSolution{public: string modifyString(string s){for(int i =0;i < s.size();i++){if(s[i]=='?')// 替换{for(char ch ='a';ch <='z';ch++){if((i ==0|| ch != s[i -1])&&(i == s.size()-1|| ch != s[i +1])){ s[i]= ch;break;}}}}return s;}};
在这里插入图片描述

1.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

040 提莫攻击

力扣链接:495. 提莫攻击

题目描述:

在这里插入图片描述

2.1 解法:模拟 + 分情况讨论

思路:模拟 + 分情况讨论。

我们只要计算相邻两个时间点的差值即可:

(1)如果差值大于等于中毒时间,说明上次中毒可以持续duration秒;(2)如果差值小于中毒时间,那么上次的中毒只能持续两者的差值。

2.2 算法实现

classSolution{public:intfindPoisonedDuration(vector<int>& timeSeries,int duration){int ret =0;int n = timeSeries.size();for(int i =1;i < n;i++)// 计算当前位置和前面位置的差{int x = timeSeries[i]- timeSeries[i -1];if(x >= duration){ ret += duration;}else{ ret += x;}}// 最后一次中毒的时间是要把中毒时间全部算上的return ret + duration;}};
在这里插入图片描述

2.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

041 Z 字形变换

力扣链接:6. Z 字形变换

题目描述:

在这里插入图片描述

3.1 算法思路:模拟 +找规律

3.1.1 表格1:row = 4时各行的数字序列

找规律,用row代替行数,row = 4时画出的N字形如下:

行号数字(表达式)数字(值,row=4)
10, 2row-2, 4row-40, 6, 12
21, 2row-3, 2row-1, 4row-5, 4row-31, 5, 7, 11, 13
32, 2row-4, 2row, 4row-6, 4row-22, 4, 8, 10, 14
43, 2row+1, 4row-13, 9, 15

3.1.2 表格2:用周期T = 2row - 2表示的数字规律

不难发现,数据是以2roW-2为一个周期进行规律变换的。将所有数替换成用周期来表示的变量:

行号 (i)数字序列(用 T 表示)说明
i=00, T, 2T公差为 T 的等差数列
i=11, T-1, T+1, 2T-1, 2T+1第一个数为 i,之后每组两个数围绕 T 的倍数对称
i=22, T-2, T+2, 2T-2, 2T+2同上
i=33, T+3, 2T+3公差为 T 的等差数列(最后一行数字为 i, T+i, 2T+i, …)

可以观察到,第一行、第四行为差为2roW-2的等差数列;第二行、第三行除了第一个数取值为行数,每组下标为(2n - 1 , 2n)的数围绕(2row - 2)的倍数左右取值。

以此规律,我们可以写出迭代算法。

3.2 算法实现

classSolution{public: string convert(string s,int numRows){// 处理边界情况if(numRows ==1)return s;// 公差d == 0 string ret;int d =2* numRows -2,n = s.size();// 1、先处理第一行for(int i =0;i < n;i += d) ret += s[i];// 2、处理中间行for(int k =1;k < numRows -1;k++)// 枚举每一行{for(int i = k,j = d - k;i < n || j < n;i += d,j += d)// 写成“或”是因为只要这两个位置有一个结果成立就要写到最终结果里{if(i < n) ret += s[i];if(j < n) ret += s[j];}}// 3、处理最后一行for(int i = numRows -1;i < n;i += d) ret += s[i];return ret;}};
在这里插入图片描述

3.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

042 外观数列

力扣链接:38. 外观数列

题目描述:

在这里插入图片描述

4.1 解法思路:模拟

在这里插入图片描述

所谓【外观数列】,其实只是依次统计字符串中连续且相同的字符的个数。依照题意,依次模拟即可。

4.2 算法实现

classSolution{public: string countAndSay(int n){ string ret ="1";for(int i =1;i < n;i++)// 解释 n - 1次 ret 即可{ string tmp;int len = ret.size();for(int left =0,right =0;right < len;){while(right < len && ret[left]== ret[right]) right++; tmp +=to_string(right - left)+ ret[left];// to_string:个数转换 left = right;} ret = tmp;}return ret;}};
在这里插入图片描述

4.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

043 数青蛙

力扣链接:1419. 数青蛙

题目描述:

在这里插入图片描述

5.1 解法:位运算

模拟青蛙的叫声。

  • 当遇到'r''o''a''k'这四个字符的时候,我们要去看看每一个字符对应的前驱字符,有没有青蛙叫出来。如果有青蛙叫出来,那就让这个青蛙接下来喊出来这个字符;如果没有,直接返回-1;
  • 当遇到'c'这个字符的时候,我们去看看'k'这个字符有没有青蛙叫出来。如果有,就让这个青蛙继续去喊'c'这个字符;如果没有的话,就重新搞一个青蛙。

5.2 算法实现

classSolution{public:intminNumberOfFrogs(string croakOfFrogs){ string t ="croak";// 叫声int n = t.size();// 长度 vector<int>hash(n);// 用数组来模拟哈希表 unordered_map<char,int> index;// [x , x这个字符对应的下标]for(int i =0;i < n;i++) index[t[i]]= i;for(auto ch : croakOfFrogs){if(ch =='c'){if(hash[n -1]!=0) hash[n -1]--; hash[0]++;}else{int i = index[ch];if(hash[i -1]==0)return-1; hash[i -1]--,hash[i]++;// 前驱--,当前++}}for(int i =0;i < n -1;i++)if(hash[i]!=0)return-1;return hash[n -1];}};
在这里插入图片描述

5.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝再次感谢您的阅读!

结语:希望对学习Python相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾:

【优选算法必刷100题:专题五】(位运算算法)第033~38题:判断字符是否唯一、丢失的数字、两整数之和、只出现一次的数字 II、消失的两个数字

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡૮₍ ˶ ˊ ᴥ ˋ˶₎ა

Read more

图的遍历(DFS+BFS)

图的遍历(DFS+BFS)

更加完整详细内容可查看【免费版Java学习笔记】和【免费版Java面试题】 免费版Java学习笔记(28w字)链接:https://www.yuque.com/aoyouaoyou/sgcqr8 免费版Java面试题(20w字)链接:https://www.yuque.com/aoyouaoyou/wh3hto 完整版Java学习笔记200w字,附有代码实现,图解清楚,仅需9.9 完整版Java面试题,150w字,高频面试题,内容详细,仅需9.9 完整版链接: https://www.xiaohongshu.com/user/profile/63c2d512000000002601232c 祝您新的一年事事马到成功,身体健康,阖家幸福,大展宏图! 一、图的遍历介绍 1.1 遍历的定义与要求

By Ne0inhk
【动态规划】风扫枯杨,满地堆黄叶 - 9. 完全背包问题

【动态规划】风扫枯杨,满地堆黄叶 - 9. 完全背包问题

本篇博客给大家带来的是完全背包问题之动态规划解法技巧. 🐎文章专栏: 动态规划 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 * 要开心 * 要快乐 * 顺便进步 * 1. 完全背包 * 2. 零钱兑换 * * 要开心 要快乐 顺便进步 1. 完全背包 题目链接:DP42 【模板】完全背包 题目内容: 描述 你有一个背包,最多能容纳的体积是V。 现在有n种物品,每种物品有任意多个,第i种物品的体积为 vi ,价值为wi 。 (1)求这个背包至多能装多大价值的物品? (2)若背包恰好装满,求至多能装多大价值的物品? 输入描述: 第一行两个整数n和V,表示物品个数和背包体积。 接下来n行,每行两个数 vi

By Ne0inhk
机器学习:Python地铁人流量数据分析与预测系统 基于python地铁数据分析系统+可视化 时间序列预测算法 ✅

机器学习:Python地铁人流量数据分析与预测系统 基于python地铁数据分析系统+可视化 时间序列预测算法 ✅

博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅 点击查看作者主页,了解更多项目! 🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅 1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅ 2、大数据毕业设计:2026年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅ 1、项目介绍 技术栈: Python语言、Django框架、Echarts可视化、HTML、prophet 时间序列预测算法 项目介绍 1. 数据可视化层:基于Echarts可视化库与HTML搭建前端展示界面,支持多维度人流量数据可视化呈现,包括每年日均人流量趋势、每日人流量变化、地铁信息概况等,通过图表直观展现数据特征,提升数据解读效率。

By Ne0inhk

【算法面试必刷】15. 三数之和

目录 题目 题目链接 思路 复杂度 1. 排序阶段 2. 双指针搜索阶段 3. 总时间复杂度 4. 空间复杂度 代码 题目 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 题目链接 15. 三数之和 - 力扣(

By Ne0inhk