Java 模拟算法实战
模拟算法的核心在于严格按照题目描述进行逐步操作。这类问题通常逻辑直观,但容易在边界条件和细节处理上出错。下面通过五个经典的 LeetCode 例题,结合 Java 代码实现,深入讲解如何处理这类场景。
替换所有的问号
题目思路
将字符串中的 ? 全部替换为小写字母,要求替换后的字符不能与相邻的字符重复。这是一个典型的局部贪心策略,遍历字符串找到 ?,尝试用 'a' 到 'z' 填充,直到满足条件即可。
关键点
注意处理首尾边界情况。当 ? 位于开头或结尾时,只需检查一侧邻居;中间位置则需同时检查左右两侧。
class Solution {
public String modifyString(String s) {
int n = s.length();
char[] arr = s.toCharArray();
for (int i = 0; i < n; i++) {
if (arr[i] == '?') {
// 尝试填入 'a' 到 'z'
for (char ch = 'a'; ch <= 'z'; ch++) {
// 检查是否与前一个或后一个字符冲突
if ((i == 0 || arr[i - 1] != ch) &&
(i == n - 1 || arr[i + 1] != ch)) {
arr[i] = ch;
break;
}
}
}
}
return new String(arr);
}
}
- 时间复杂度:O(n)
- 空间复杂度:O(n)
提莫攻击
计算中毒总时长。如果两次攻击间隔小于持续时间,则第二次攻击会打断第一次的剩余时间;否则累加完整持续时间。核心在于比较相邻两次攻击的时间差值与技能持续时间的关系。


