🎬 胖咕噜的稞达鸭 :个人主页
🔥 个人专栏 : 《数据结构》《C++初阶高阶》
《Linux系统学习》
《算法日记》
⛺️技术的杠杆,撬动整个世界!
模拟:这个专题最重要的就是理解题意。借助纸和笔实现题目中的过程。找出规律即可。
替换所有的问号
[1576. 替换所有的问号 - 力扣(LeetCode)](https://leetcode.cn/problems/replace-all-s-to-avoid-consecutive-repeating-characters/submissions/686036885/)\](替换所有的问号)
题目解析:
字符串中有问号?就替换成26个字母其一,最后返回的字符串中不允许出现重复的字符。
算法原理:
先遍历一遍字符串找出问号,接着替换,用26个英文字母一个一个替换,看是否满足这个空,不能跟左边的字母相同,也不能跟右边的字母相同。
如果s\[i\]问号空有可能在:
要么在字符串的第一个位置,要么是跟前面一个位置的字符不相同;
或者是最后一个位置,要么就是跟后一个位置的字符不相同;
(这两个条件要同时满足)
同时满足就插入。
```cpp
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 || ch != s[i-1]) && (i == n-1 || ch != s[i+1]))
{
s[i] = ch;
break;
}
}
}
}
return s;
}
};
```
### 提莫攻击
题目解析:给定一个时间区间 `[t, t + duration - 1]`(含 `t` 和 `t + duration - 1`)处于中毒状态。有一个不变的量duration,作为每一次\>中毒的持续时长,当第一次中毒之后,还没有恢复(没有超过中毒的持续时长)再次中毒,就会从第二次中毒的时刻重新往后记单次中毒时长。
求解中毒状态的总秒数。
算法原理:
```cpp
//下面给定一个时间区间[1,19] duration = 3
1 4 5 8 9 15 19
//第1秒中毒: 中毒区间【1,3】
//第4秒中毒: 中毒区间[4, 6] ---> 由于第5秒又中毒:中毒区间[5,7]
//第8秒中毒: 中毒区间[8,10] ---> 由于第9秒又中毒:中毒区间[9,11]
//第15秒中毒:中毒区间[15,17]
//第19秒中毒:中毒区间[19,21]
```
先定义一个ret来收集最后的中毒秒数。
遍历数组:
从索引为1的位置开始,如果第一次和第二次中毒的间隔时长大于等于duration,直接计入ret中;
如果第一次和第二次中毒的间隔时长小于duration, 那么该计入第一次中毒时长的只能是两次间隔差。
```cpp
class Solution {
public:
int findPoisonedDuration(vector