39. 替换所有问号
这道题的核心在于模拟替换过程。我们需要从左到右扫描字符串,一旦遇到问号,就尝试用 'a' 到 'z' 中的字符进行填充。关键在于填充后的字符不能与它的前一个或后一个字符相同。
注意边界情况,比如问号在开头时只需要检查右侧邻居,在结尾时只需检查左侧邻居。由于字母表有 26 个字符,而相邻最多只有两个限制,所以一定能找到合适的字符。
模拟解法代码(C++)
class Solution {
public:
string modifyString(string s) {
int n = s.size();
for (int i = 0; i < n; i++) {
if (s[i] == '?') {
// 遍历 a-z 尝试填充
for (char ch = 'a'; ch <= 'z'; ch++) {
// 确保不与前一个字符相同,且不与后一个字符相同
if ((i == 0 || s[i - 1] != ch) && (i == n - 1 || s[i + 1] != ch)) {
s[i] = ch;
break;
}
}
}
}
return s;
}
};
40. 提莫攻击
这道题其实是在计算总中毒时长。核心逻辑在于分析两次攻击之间的时间间隔。
如果两次攻击的时间差大于等于中毒持续时间 duration,说明上一次中毒效果已经完整释放,可以累加完整的 duration。如果时间差小于 duration,说明下一次攻击打断了上一次的持续效果,此时只能累加实际的时间间隔。最后别忘了加上最后一次攻击的完整中毒时间。
C++ 算法代码
class Solution {
public:
int findPoisonedDuration(vector<int>& timeSeries, int duration) {
n = timeSeries.(), ret = ;
( i = ; i < n; i++) {
(timeSeries[i] - timeSeries[i - ] < duration)
ret += timeSeries[i] - timeSeries[i - ];
ret += duration;
}
ret + duration;
}
};


