039 替换所有的问号
题目描述:
给定一个字符串 s,其中包含小写字母和问号 ?。你需要将所有的问号替换为小写字母,使得最终字符串中不包含两个连续相同的字符。
1.1 解法思路
核心是贪心策略。遍历字符串,遇到问号时,尝试用 a 到 z 的字符填充。只要选中的字符不与前一个和后一个字符相同即可。由于只有 26 个字母,且最多只需要避开左右两个邻居,一定能找到合适的字符。
1.2 代码实现
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;
}
};
1.3 实战要点
这里有个细节要注意:当处理到第 i 个位置时,s[i+1] 可能还是 ?。但因为我们是从左往右遍历,一旦填好 s[i],它就不再变了。所以判断 s[i+1] 时,如果它是 ?,其实不会等于当前填入的 ch(除非 ch 也是 ?,但我们填的是字母),逻辑上是安全的。实际运行时直接比较字符值即可。
040 提莫攻击
题目描述:
在《英雄联盟》中,提莫的攻击会让艾希中毒。给定攻击时间序列 timeSeries 和中毒持续时间 duration,计算总共中毒的时间。


