算法44,模拟算法,数青蛙

为你整理 LeetCode 1419「数青蛙」两种解法的对比笔记:

📝 LeetCode 1419 数青蛙 - 解法笔记

核心思路 :状态机计数。青蛙叫必须依序输出 c -> r -> o -> a -> k。用数组模拟哈希表记录每个字符的等待状态,hash[4](或 hash[0])记录空闲/新增青蛙数。


解法一:硬编码下标法(常规解法)

核心逻辑:

直接定义长度为 5 的数组,通过多个 else if 手动判断当前字符并转移状态。

代码框架:

复制代码
// 1. 长度校验
if (c.length() % 5 != 0) return -1;
int[] hash = new int[5]; // 0:c, 1:r, 2:o, 3:a, 4:空闲

for (char ch : c.toCharArray()) {
    if (ch == 'c') {
        if (hash[4] != 0) hash[4]--;
        hash[0]++;
    } else if (ch == 'r' && hash[0] != 0) {
        hash[0]--; hash[1]++;
    } 
    // ... 依次 else if 处理 'o', 'a', 'k'
    else return -1; // 乱序或非法字符拦截
}
// 检查是否有未叫完的青蛙
for (int i = 0; i < 4; i++) if (hash[i] != 0) return -1;
return hash[4];

特点:

  • 优点:直观易懂,无需额外数据结构,空间复杂度极低。
  • 缺点:代码冗长,如果蛙鸣单词变成更长的字符串(如10个字母),扩展性差。

解法二:HashMap + 动态索引法(通用/老师解法)

核心逻辑:

利用 HashMap 存储字符与下标的映射关系,通过 index.get(ch) 动态获取当前字符对应的数组下标,实现通用化状态转移。

代码框架:

复制代码
// 1. 长度校验
if (c.length() % 5 != 0) return -1;

String t = "croak";
int n = t.length();
int[] hash = new int[n]; // 0:c, 1:r, 2:o, 3:a, 4:空闲
Map<Character, Integer> index = new HashMap<>();

// 初始化字符映射
for (int i = 0; i < n; i++) index.put(t.charAt(i), i);

for (char ch : c.toCharArray()) {
    if (ch == t.charAt(0)) { // 遇到 'c'
        if (hash[n-1] != 0) hash[n-1]--;
        hash[0]++;
    } else {
        int i = index.get(ch); // 动态获取下标
        // 防御:非法字符或前序状态为0(乱序)
        if (i == null || hash[i-1] == 0) return -1;
        hash[i-1]--; hash[i]++;
    }
}
// 检查前4个状态是否清空
for (int i = 0; i < n-1; i++) if (hash[i] != 0) return -1;
return hash[n-1];

特点:

  • 优点:代码简洁优雅,通用性强(适用于任何长度的固定顺序单词混合问题)。
  • 缺点 :引入了 HashMap,有额外的空间开销。

⚠️ 踩坑与调试记录
  1. 变量作用域冲突 :同一作用域内不能声明同名变量。之前报错 variable i is already defined 是因为在外层 for(int i=0...) 内部又写了 int i = index.get(ch)。解决:内层改用 idx 或不同变量名。
  2. 逻辑嵌套错误 :之前误将字符遍历和结尾检查嵌套在初始化循环里,导致第一次迭代就 return。解决:初始化、遍历、检查三步必须平级并列。
  3. 防御性校验缺失 :必须加长度校验(%5)拦截非法输入;HashMap 解法需判空(i == null)防止遇到非 croak 字符时报错。
💡 适用场景
  • 硬编码法:适合字符集小、题目固定的快速刷题场景。
  • 通用映射法:适合需要抽象逻辑、字符集较大或面试中展示代码扩展性的场景。
相关推荐
乐迪信息21 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
Sirens.1 天前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕1 天前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng1 天前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆1 天前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的1 天前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙1 天前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
zhangfeng11331 天前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu
学代码的CJY1 天前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
白帽攻防录1 天前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt