模拟算法实战:5 道经典题目解析
模拟算法的核心在于还原问题的实际运行过程。通过遍历、状态跟踪或规律推导,将抽象逻辑转化为具体代码。以下精选五道典型题目,涵盖字符串处理、区间计算及状态机模型。
039 替换所有的问号
题目描述:
给定一个字符串 s,其中包含小写字母和问号 ?。要求将所有问号替换为小写字母,使得最终字符串中不存在连续重复的字符。
解题思路
采用贪心策略。从左到右遍历字符串,遇到 ? 时,尝试用 'a' 到 'z' 中的字符进行替换。判断条件只需确保当前字符不与前一个和后一个字符相同即可。由于字母表有 26 个字符,而最多只有两个邻居需要避开,因此总能找到合适的字符(通常 'a', 'b', 'c' 中必有一个可用)。
代码实现
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;
}
};
工程师手记: 这里不需要真的遍历所有 26 个字母,实际上只要试三个字符就足够覆盖所有情况,但为了逻辑清晰,遍历全量也是 O(26*N),复杂度可接受。关键是边界条件的判断,首尾字符没有邻居,需单独处理。
040 提莫攻击
题目描述:
提莫在时间轴上发起攻击,每次攻击使目标中毒 duration 秒。给定攻击时间序列 timeSeries 和中毒持续时间 ,计算总中毒时间。


