数青蛙 ---- 模拟

题目链接

题目:

分析:

  • 题目的意思是:
    一次蛙鸣是一个完整的字符串"croak", 给你一个字符串, 让你求出最少的青蛙数目
    示例一: 两次完整的"croak", 可以由一只青蛙完成, 所以答案为1
    示例二: 第一次蛙鸣还没有结束, 又出现了"c", 说明有第二只青蛙, 所以答案为2
    示例三: 如果有无效的字符, 或蛙鸣不完整, 直接返回-1
  • 我们可以借助哈希表<Character,Integer>
    • 在遍历字符串时, 如果出现"r"字符, 我们要看他前面即"c" 在哈希表中是否存在, 有两种情况:
      如果存在说明此时的"r"是有效字符, 将"c"对应的数量--, 将"r"对应的数量++
      如果不存在, 说明"r"无效, 直接返回-1
    • 同理, 出现"o""a""k", 也要找他们前面的字符在哈希表中的数量是否为0
    • 那么此时, 如果有一次完整的蛙鸣, 那么在"k"对应的数量就会存储下来
    • 如果出现"c", 我们要看是否有已经完成蛙鸣的青蛙(因为我们要找的是最小的数量), 这个数量是存储到"k"对应的哈希表中的, 分两种情况:
      如果"k"对应的哈希表为0, 说明前面没有空闲的青蛙, 所以应该增加蛙的数量, 让"c"对应的哈希表++
      如果"k"对应的哈希表不为0, 说明有空闲的青蛙, 让"k"哈希表--,"c"哈希表++即可
  • 在实现代码时, 我们不需要真的创建哈希表, 只需要用哈希数组即可, 0下标对应"c", 1下标对应"r"...., 想要找到前一个字符的位置, 只需要用String中的index()方法找到下标, 再-1即可

代码:

java 复制代码
class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
        String str = "croak";
        int n = str.length();
        char[] arr = croakOfFrogs.toCharArray();
        int[] hash = new int[n];
        for (char x : arr) {
            if (x == str.charAt(0)) {
                if (hash[n - 1] != 0)
                    hash[n - 1]--;
                hash[0]++;

            } else {
                int i = str.indexOf(x);
                if (hash[i - 1] == 0)
                    return -1;
                hash[i - 1]--;
                hash[i]++;
            }
        }
        for (int i = 0; i < hash.length - 1; i++) {
            if (hash[i] != 0)
                return -1;
        }
        return hash[n - 1];

    }
}
相关推荐
Full Stack Developme11 分钟前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
Jerry1 小时前
LeetCode 707. 设计链表
算法
C语言小火车2 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序
kebidaixu2 小时前
两轮BMS AFE SH367306 I2C 读写时序
算法
智能排队系统_头部供应商2 小时前
RK3588边缘网关改造银行排队系统实战
算法
Fabarta2 小时前
从 0 实现 ChatGPT 风格的流式对话 UI
算法·架构
手写码匠2 小时前
手写 AI 上下文压缩系统:从零实现 Prompt 压缩与选择性上下文管理
人工智能·深度学习·算法·aigc
EAI-Robotics3 小时前
机器人操作鲁棒性:当机械手遇上真实世界的不确定性
人工智能·算法·机器人
Tairitsu_H4 小时前
[LC优选算法#17] 链表 | 合并 K 个升序链表 | K个⼀组翻转链表
数据结构·算法·链表