模拟算法精选:五道经典题目深度解析
039 替换所有的问号
题目描述:
给定一个字符串 s,将其中的所有问号 ? 替换为小写英文字母。要求替换后不能出现连续重复的字符。
解题思路
采用纯模拟策略。遍历字符串,遇到问号时,尝试用 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 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;
}
};
提示: 实际编码时注意边界条件,特别是首尾字符的判断,避免数组越界。
040 提莫攻击
题目描述:
在《英雄联盟》中,提莫的攻击会让目标中毒。给定攻击时间序列 timeSeries 和中毒持续时间 duration,计算总中毒时间。
解题思路
核心在于处理重叠区间。比较相邻两次攻击的时间差:
- 若时间差大于等于
duration,说明上次中毒已完全结束,累加完整时长。 - 若时间差小于
duration,说明中毒被刷新,只累加时间差部分。 最后别忘了加上最后一次攻击的完整持续时间。


