算法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 字符时报错。
💡 适用场景
  • 硬编码法:适合字符集小、题目固定的快速刷题场景。
  • 通用映射法:适合需要抽象逻辑、字符集较大或面试中展示代码扩展性的场景。
相关推荐
Robert--cao4 分钟前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄1 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘561 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
y1su3 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan4 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
其实防守也摸鱼4 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机5 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS1005 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
CV爱数码5 小时前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct
TunerT_TQ5 小时前
超立方体Ramsey(openai/math 家族171)H11攻坚日志|D60–D69:Star分组重数、二幂坐标群、奇偶入射语义与Site‑Level候选计数形式化闭环
算法