模拟算法实战:替换问号、提莫攻击、N 字形变换、外观数列与数青蛙
汇总了五道模拟算法题的解法。包含 LC1576 替换问号,通过遍历检查前后字符避免重复;LC495 提莫攻击,计算攻击间隔累加中毒时长;LC6 N 字形变换,利用周期规律按行重组字符串;LC38 外观数列,双指针统计连续字符生成下一项;LC1419 数青蛙,维护叫声状态数组判断最小青蛙数。所有代码基于 Java 实现,注重边界条件与逻辑优化。

汇总了五道模拟算法题的解法。包含 LC1576 替换问号,通过遍历检查前后字符避免重复;LC495 提莫攻击,计算攻击间隔累加中毒时长;LC6 N 字形变换,利用周期规律按行重组字符串;LC38 外观数列,双指针统计连续字符生成下一项;LC1419 数青蛙,维护叫声状态数组判断最小青蛙数。所有代码基于 Java 实现,注重边界条件与逻辑优化。

按照题目要求,双层循环,外层遍历字符串;内层从 a 到 z 依次尝试,与前后不等则填入。
public String modifyString(String s) {
char[] ss = s.toCharArray();
int n = ss.length;
for (int i = 0; i < n; i++) {
if (ss[i] != '?') continue;
for (char ch = 'a'; ch <= 'z'; ch++) {
if ((i == 0 || ch != ss[i - 1]) && (i == n - 1 || ch != ss[i + 1])) {
ss[i] = ch;
break;
}
}
}
return new String(ss);
}
计算两次'受到攻击'之间的差值 x:
x >= d,则 ret += dx < d,则 ret += x最后要加上一个 d,表示最后一次'攻击'的时间。
public int findPoisonedDuration(int[] timeSeries, int duration) {
int ret = 0;
for (int i = 1; i < timeSeries.length; i++) {
int x = timeSeries[i] - timeSeries[i - 1];
ret += (x >= duration) ? duration : x;
}
ret += duration;
return ret;
}
d = n + n - 2 = 2n - 2
解法一:创建二维数组,按照 N 形依次填入。时间复杂度和空间复杂度都是字符串长度 * numRow。
注意: n=1 直接返回原字符串,按照上面的规律会陷入死循环。
public String convert(String s, int numRows) {
if (numRows == 1) return s;
StringBuilder ret = new StringBuilder();
int n = s.length();
int d = 2 * numRows - 2; // 公差
int n1 = (n + d - 1) / d; // 周期个数,向上取整
// 第 0 行
for (int k = 0; k < n1; k++) ret.append(s.charAt(k * d));
// 中间行
for (int i = 1; i < numRows - 1; i++) {
for (int k = 0; k < n1; k++) {
if (i + k * d < n) ret.append(s.charAt(i + k * d));
if (d - i + k * d < n) ret.append(s.charAt(d - i + k * d));
}
}
// 最后一行
for (int k = 0; k < n1; k++) {
if (numRows - 1 + k * d < n) ret.append(s.charAt(numRows - + k * d));
}
ret.toString();
}
利用双指针来模拟过程:left,right 初始为 0
public String countAndSay(int n) {
String s = "1";
for (int i = 1; i < n; i++) {
StringBuilder tmp = new StringBuilder();
int len = s.length();
int count = 0;
for (int left = 0, right = 0; right < len;) {
while (right < len && s.charAt(left) == s.charAt(right)) right++;
tmp.append(String.valueOf(right - left));
tmp.append(s.charAt(left));
left = right;
}
s = tmp.toString();
}
return s;
}
使用哈希表来存 c r o a k 每个字符:
r o a k 这四个字符的时候,看每一个字符对应的前驱字符,有没有青蛙叫出来。如果有青蛙叫出来,那就让这个青蛙接下来喊出来这个字符;如果没有,直接返回 -1;c 这个字符的时候,看'k'这个字符有没有青蛙叫出来。如果有,就让这个青蛙继续去喊 c 这个字符;如果没有,就重新搞一个青蛙。public int minNumberOfFrogs(String c) {
char[] croakOfFrogs = c.toCharArray();
int[] croak = new int[5];
String s = "croak";
Map<Character, Integer> index = new HashMap<>();
for (int i = 0; i < 5; i++) index.put(s.charAt(i), i);
for (char ch : croakOfFrogs) {
if (ch == 'c') {
if (croak[4] != 0) croak[4]--;
croak[0]++;
} else {
int i = index.get(ch);
if (croak[i - 1] != 0) {
croak[i - 1]--;
croak[i]++;
} else {
return -1;
}
}
}
for (int i = 0; i < 4; i++) {
if (croak[i] != 0) return -1;
}
return croak[];
}

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online