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;
}
};
提示:实际编码时注意边界判断,
i==0时无前驱,i==size-1时无后继,避免数组越界。
040 提莫攻击
题目描述: 在《英雄联盟》中,提莫的攻击会让对手中毒 duration 秒。给定攻击时间序列 timeSeries 和中毒时长 duration,计算总中毒时间。
2.1 解法思路
这是一个典型的区间合并问题。我们只需关注相邻两次攻击的时间间隔:
- 如果间隔大于等于 duration,说明上次中毒效果完全释放,累加 duration。
- 如果间隔小于 duration,说明下次攻击打断了上次中毒,只累加间隔时间。 最后别忘了加上最后一次攻击的完整 duration。
2.2 代码实现
class {
:
{
(timeSeries.()) ;
ret = ;
n = timeSeries.();
( i = ; i < n; i++) {
x = timeSeries[i] - timeSeries[i - ];
(x >= duration) {
ret += duration;
} {
ret += x;
}
}
ret + duration;
}
};


