【优选算法必刷100题】第39-40题(模拟):替换所有问号,提莫攻击

🔥个人主页:Cx330🌸
❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》
《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔
🌟心向往之行必能至
🎥Cx330🌸的简介:

目录
前言:
聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力
39.替换所有问号
题目链接:
1576. 替换所有的问号 - 力扣(LeetCode)
题目描述:

题目示例:

算法原理(模拟):
思路:
就是模拟这个过程就行。从前往后遍历整个字符串,找到问号之后,就用a~z的每一个字符去尝试替换即可
模拟解法代码(C++):
class Solution { public: string modifyString(string s) { int n=s.size(); for(int i=0;i<n;i++) { if(s[i]=='?')//替换 { for(char ch='a';ch<='z';ch++) { //当'?'在第一位或者字符不与前面元素相同&&当'?'在最后一位或者字符不与后面元素相同 if((i==0||s[i-1]!=ch)&&(i==n-1||s[i+1]!=ch)) { s[i]=ch; break; } } } } return s; } };
博主手记(字体还请见谅哈):

40.提莫攻击
题目链接:
495. 提莫攻击 - 力扣(LeetCode)
题目描述:

题目示例:

解法(模拟+分情况讨论):
算法思路:
模拟+分情况讨论。
计算相邻两个时间点的差值:
- 如果差值大于等于中毒时间,说明上次中毒可以持续
duration秒。 - 如果差值小于中毒时间,那么上次的中毒只能持续两者的差值
C++算法代码:
代码一:
class Solution { public: int findPoisonedDuration(vector<int>& timeSeries, int duration) { int n=timeSeries.size(),ret=0; for(int i=1;i<n;i++) { if(timeSeries[i]-timeSeries[i-1]<duration) ret+=timeSeries[i]-timeSeries[i-1]; else ret+=duration; } //加上最后一次攻击的中毒时间 return ret+duration; } };
博主手记(字体还请见谅哈):

总结:
结尾:替换所有问号(LeetCode 1576)使用模拟方法遍历字符串,遇到问号时用a-z字符替换,确保不与相邻字符重复;提莫攻击(LeetCode 495)通过分情况讨论计算中毒总时长:若攻击间隔大于中毒时间则累加duration,否则累加实际间隔时间