模拟算法专题:5 道经典题目解析
本专题聚焦于模拟类算法,涵盖字符串处理、时间序列计算及状态追踪。以下通过 C++ 实现五道典型题目,重点在于理清逻辑边界与优化遍历策略。
039 替换所有的问号
题目描述:
给定一个字符串 s,将其中所有的问号 ? 替换为小写英文字母,使得最终结果中不包含连续重复的字符。
解题思路
采用纯模拟策略。从左到右遍历字符串,遇到 ? 时,尝试用 a~z 填充。关键在于检查左右邻居是否相同,确保当前字符不与前后冲突。
代码实现
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++) {
// 检查左邻居和右邻居
bool left_ok = (i == 0 || ch != s[i - 1]);
bool right_ok = (i == s.size() - 1 || ch != s[i + 1]);
if (left_ok && right_ok) {
s[i] = ch;
break;
}
}
}
}
return s;
}
};
040 提莫攻击
题目描述:
在《英雄联盟》中,提莫的攻击会让目标中毒持续 duration 秒。给定攻击时间序列 timeSeries,计算总中毒时长。
解题思路
核心是计算相邻两次攻击的时间间隔。如果间隔大于等于 duration,则上次中毒完整持续;否则,只计算间隔时间。最后一次攻击必定贡献完整的 duration。


