模拟算法概述
模拟算法的核心在于'按部就班'。它不需要复杂的数学推导,但极度考验对边界条件的把控。实际开发中,这类题目往往出现在业务逻辑的抽象建模环节。下面我们通过几道经典题目,看看如何在代码中落地这些细节。
替换所有的问号
题目核心:将字符串中的 ? 替换为小写字母,且替换后的字符不能与相邻字符重复。
这道题的关键在于处理首尾字符的特殊情况。当我们遍历到 ? 时,需要尝试从 a 到 z 寻找一个合法的字符。由于字母表足够大(26 个),总能找到一个不与左右邻居冲突的字符。
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 String(chars);
}
}


