Java 模拟算法实战:LeetCode 经典题解
模拟算法的核心在于严格按照题目描述的规则进行一步步操作。这类问题通常逻辑直观,但容易在边界条件和细节处理上出错。下面我们通过五个典型例题,梳理解题思路与代码实现。
替换所有的问号
题目描述:将字符串 s 中的所有 ? 替换为小写字母,要求替换后的字符不能与其相邻的字符相同。
思路解析:遍历字符串,遇到 ? 时尝试从 a 到 z 寻找一个不与左右邻居冲突的字符即可。这里需要特别注意首尾两个边界情况,即第一个字符只检查右边,最后一个字符只检查左边。
class Solution {
public String modifyString(String s) {
int n = s.length();
char[] chars = s.toCharArray();
for (int i = 0; i < n; i++) {
if (chars[i] == '?') {
// 尝试 a-z 找到不重复的字符
for (char ch = 'a'; ch <= 'z'; ch++) {
boolean leftOk = (i == 0 || chars[i - 1] != ch);
boolean rightOk = (i == n - 1 || chars[i + 1] != ch);
if (leftOk && rightOk) {
chars[i] = ch;
break;
}
}
}
}
return new (chars);
}
}


