38. 替换所有问号
题目描述
给定一个字符串 s,将其中所有的问号 ? 替换为小写英文字母,使得最终结果中不包含连续重复的字符。
题目示例
输入:"a?a?"
输出:"abac"
解题思路
这道题的核心在于模拟替换过程。我们需要遍历字符串,一旦遇到问号,就尝试用 a 到 z 之间的字符进行填充。关键约束是替换后的字符不能与前一个或后一个字符相同。由于只有 26 个字母,且最多只需要避开前后两个字符,所以一定能找到合适的字符。
参考实现
class Solution {
public:
string modifyString(string s) {
for(int i = 0; i < s.size(); i++) {
if(s[i] == '?') {
// 尝试 a-z 中的字符
for(char c = 'a'; c <= 'z'; c++) {
// 检查是否与前一个或后一个字符冲突
if((i == 0 || s[i - 1] != c) && (i == s.size() - 1 || s[i + 1] != c)) {
s[i] = c;
break;
}
}
}
}
return s;
}
};
39. 提莫攻击
题目描述
在《英雄联盟》的背景故事中,提莫的攻击会让艾希中毒。如果他在另一个时间点再次攻击,中毒状态会刷新。给定攻击时间序列和中毒持续时间,计算总中毒时长。
题目示例
输入:timeSeries = [1,4], duration = 2
输出:4
解释:第 1 秒攻击持续 2 秒,第 4 秒攻击持续 2 秒,中间无重叠。
解题思路
这是一个典型的区间合并问题,但逻辑更简单。我们关注相邻两次攻击的时间差:
- 如果两次攻击间隔大于等于中毒持续时间,说明上次中毒效果完全释放,累加完整时长。
- 如果间隔小于中毒持续时间,说明下次攻击刷新了状态,实际有效时长仅为时间差。


