39. 替换所有问号
题目描述
给定一个字符串 s,其中包含小写字母和问号 ?。你需要将所有的问号替换为小写字母,使得结果字符串中不包含两个连续的相同字符。返回替换后的字符串。
解法(模拟)
算法思路
直接模拟替换过程。从左到右遍历字符串,遇到问号时,尝试用 a 到 z 的字符进行填充。关键在于检查新字符是否与前后字符重复。只要找到一个不与前驱和后继冲突的字符即可停止尝试。由于字母表有 26 个字符,而最多只有两个邻居需要避开,所以一定能找到合适的字符。
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 || ch != s[i - 1]) && (i == n - 1 || ch != s[i + 1])) {
s[i] = ch;
break;
}
}
}
}
return s;
}
};
40. 提莫攻击
题目描述
在《英雄联盟》的背景故事中,提莫的攻击会让艾希中毒。如果他在时刻 timeSeries 发起攻击,中毒持续时间固定为 duration。如果下一次攻击发生在当前中毒状态结束之前,中毒时间会叠加。请计算艾希总共处于中毒状态的秒数。
解法(模拟 + 分情况讨论)
算法思路
核心在于处理重叠区间。我们只需要比较相邻两次攻击的时间差与中毒持续时间 duration。
- 如果时间差大于等于
duration,说明上次中毒已经彻底结束,贡献时间为duration。 - 如果时间差小于
duration,说明上次中毒被中断,实际贡献时间为时间差。 最后别忘了加上最后一次攻击带来的完整duration时间。 简化写法就是每次累加min(时间差,duration),最后再加上一次 。


