算法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 字符时报错。
💡 适用场景
  • 硬编码法:适合字符集小、题目固定的快速刷题场景。
  • 通用映射法:适合需要抽象逻辑、字符集较大或面试中展示代码扩展性的场景。
相关推荐
hanlin031 小时前
刷题笔记:力扣第287题-寻找重复数
笔记·算法·leetcode
kevin_kang2 小时前
第02章 对话时间线与延迟分析
算法
科学实验家2 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法
学习智者2 小时前
《玄》IDE v3.6.3重磅发布:全功能修复与性能飞跃
开发语言·c++·ide·算法·中文语言 玄
Jasmine_llq2 小时前
《P10263 [GESP202403 八级] 公倍数问题》
算法·数论·快速 io 优化·埃氏筛(倍数枚举)·线性遍历求和
橘子汽水1682 小时前
Leetcode 322 279 零钱兑换,完全平方数
算法·leetcode
kevin_kang2 小时前
第01章 VoiceAgent 的总体架构与完整流程
算法
Lintongzg2 小时前
KV-Cache 的显存账本:长上下文、并发与量化剪枝的取舍
算法·机器学习·剪枝
小孩玩什么2 小时前
深入理解字符串匹配算法:BF算法,KMP算法
java·c语言·开发语言·数据结构·c++·算法