leetcode 1419. 数青蛙(medium)(优质解法)

news2025/3/15 6:21:11

链接:力扣(LeetCode)官网 - 全球极客挚的技术成长平台

代码:

class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
        String t="croak";
        int tLength=t.length();
        // hash 数组用来存放青蛙喊的过程,记录有多少个青蛙喊到了哪个字符
        int[] hash=new int[tLength];
        HashMap<Character,Integer> index_char=new HashMap<>();

        //将字符和对应的下标添加到 index_char 中
        for(int i=0;i<tLength;i++){
            index_char.put(t.charAt(i),i);
        }

        //遍历 croakOfFrogs 字符串,分析青蛙蛙鸣的流程
        for(int i=0;i<croakOfFrogs.length();i++){
            // 获取字符在 hash 数组中的下标
            int index=index_char.get(croakOfFrogs.charAt(i));
            if(index==0){
                //查询有没有喊完的青蛙可以继续喊
                if(hash[tLength-1]>0){
                    //有喊完的青蛙
                    hash[tLength-1]--;
                }
                //没有喊完的青蛙
                hash[index]++;
            }else{
                //判断是否有青蛙在喊前一个字符
                if(hash[index-1]>0){
                    //有青蛙在喊前一个字符
                    hash[index-1]--;
                    hash[index]++;
                }else{
                    //没有青蛙在喊前一个字符
                    return -1;
                }
            }
        }

        //判断是否有没喊完的青蛙
        for(int i=0;i<tLength-1;i++){
            if(hash[i]!=0){
                return -1;
            }
        }

        return hash[tLength-1];
    }
}

题解:

        本题采用的解法是模拟,模拟题目的要求,找到最终的结果。

        首先需要搞清题意,青蛙是根据字符串 croak 呱呱叫,只有完整的叫了 croak 才算完,如果叫的字符串不完整或者不正确,都直接返回 -1 即可

        我们可以认为,青蛙叫的时候必须按照 c -> r -> o -> a -> k 的顺序,只有叫了前一个字符才能叫后一个字符,我们可以用一个数组 hash 来记录有几只青蛙叫到了哪个字符,并用哈希表来记录字符与下标的对应关系,以示例 2 为例 croakOfFrogs = "croakcroak"

        定义一个 i 指针遍历 croakOfFrogs 字符串,让青蛙叫,当 i 指向 c 字符时表示要叫 c 字符,首先需要判断是否有已经叫好的青蛙可以来接着叫,叫好的青蛙记录在 k 字符对应的个数,个数为 0 代表没有叫好的青蛙,那就需要一个新的青蛙来叫,将 hash 数组中 c 字符对应下标中的数据 ++,然后 i 向后继续遍历

hash

c        r        o        a        k        

0        0       0        0        0

croakOfFrogs

c        r        o        a        k        c        r        o        a        k

i

        i 指针指向 r ,在青蛙喊 r 字符前需要确定有没有青蛙已经喊了 c 字符,如果没有青蛙喊 c 字符,说明就不能喊到 r 字符,此时 croakOfFrogs 中的数据就是错误的,返回 -1,但此时在 hash 数组中 c 字符对应的数据为 1 ,代表有 1 个青蛙叫到了 c 字符,可以让叫到 c 字符的青蛙继续叫 r 字符,所以在 hash 表中 c 字符对应的数据 - - ,r 字符对应的数据 ++

hash 

c        r        o        a        k        

1        0       0        0        0

croakOfFrogs

c        r        o        a        k        c        r        o        a        k

          i

        此时 i 指针向前遍历指向 o ,也是同样的处理方法,判断是否有青蛙喊到 o 字符之前的 r 字符,要是有就让该青蛙喊到 o 字符

hash 

c        r        o        a        k        

0        1       0        0        0

croakOfFrogs

c        r        o        a        k        c        r        o        a        k

                   i

        当 i 移动到第一个 k 字符以后,数据如下所示,青蛙喊到 k 字符就代表这只青蛙喊完了,hash 数组中 k 字符对应的值就是喊完的青蛙数目

        i 继续向下遍历

hash 

c        r        o        a        k        

0        0       0        0        1

croakOfFrogs

c        r        o        a        k        c        r        o        a        k

                                        i   

        当 i 继续向下遍历,遍历到 c 字符,先要判断此时是否有已经叫好在休息的青蛙,hash 数组中 k 字符对应的个数就是休息青蛙的数目,此时有 1 只青蛙在休息,所以不需要新的青蛙来叫,直接让正在休息的这个青蛙叫即可

        于是让 k 字符对应的数据减一,c 字符对应的数据加一,在休息的青蛙就去接着叫了

hash 

c        r        o        a        k        

1        0       0        0        0

croakOfFrogs

c        r        o        a        k        c        r        o        a        k

                                                 i          

        等 i 指针遍历完 croakOfFrogs 字符串以后,hash 数组中,k 字符对应的数目就是发出叫声的青蛙数目,但要注意,如果除了 k 的其他字符在 hash 数组有对应的数据说明有没叫完青蛙,这就代表 croakOfFrogs 字符串不符合规定,直接返回 -1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业网银 相关注意事项合辑 不断更新中...

山西省农村信用社 (shanxinj.com) 企业网上银行 山西省农村信用社 企业网上银行&#xff0c;注意事项&#xff1a; 1、通过安装【网银向导】修复网银安全控件、密码控件等&#xff1b; 2、登录界面无Ukey验证&#xff0c;也就是输入企业号、用户编号、登录密码及验证码即可进…

ARM12.26

整理三个按键中断代码 key_it.h #ifndef __KEY_IT_H__ #define __KEY_IT_H__ #include"stm32mp1xx_gpio.h" #include"stm32mp1xx_gic.h" #include"stm32mp1xx_exti.h" #include"stm32mp1xx_rcc.h" #include"led.h" void k…

九、Seata的AT模式

目录 9.1 什么是弱一致性 &#xff1f;9.2 Seata的弱一致性9.3 Seata的AT模式介绍9.4 AT模式流程图9.5 AT模式注意点9.6 全局锁的理解1、认识全局锁2、注册全局锁3、校验&#xff08;获取&#xff09;全局锁4、释放锁5、结论 9.7 AT的多数据源场景 9.1 什么是弱一致性 &#xf…

算符优先语法分析设计原理与实现

前言&#xff1a; 作者的词法分析程序以及算符优先语法分析设计程序仓库链接 1、目标任务 **[实验项目] **以专题 1 词法分析程序的输出为语法分析的输入&#xff0c;实现算符优先分析算法&#xff0c;完成以下描述算术表达式的算符优先文法的算符优先分析过程。 G[E]:E→E…

PgSQL技术内幕 - ereport ERROR跳转机制

PgSQL技术内幕 - ereport ERROR跳转机制 使用客户端执行SQL的时候经常遇到报ERROR错误&#xff0c;然后SQL语句就退出了。当然&#xff0c;事务也会回滚掉。本文我们看下它是如何做到退出SQL语句并回滚事务的。 1、以insert一个numeric类型值为例 表一个字段为numeric(10,2)类型…

账号与权限管理

一、Linux用户 1.1用户类型 1.普通用户&#xff1a;权限受到限制的用户 2.超级管理员&#xff1a;至高无上的权限 3.程序用户&#xff1a;是给程序使用的&#xff0c;不允许登录(为了安全性考虑) 能不能打开文件和用户有关&#xff0c;用户有自己的权限 运行程序不能使用超…

关于chatglm3 function calling的理解

ChatGLM3-6B开源了工具调用&#xff0c;好奇他是怎么实现的&#xff0c;所以写了这个文章记录。 一、测试官方的示例 官方给的示例很简单&#xff0c;只不过给的两个函数 track 和 text-to-speech 没有具体的实现&#xff0c;模型的输出也只是给出了需要调用的函数名和参数。剩…

w16php系列之基础数组

一、索引数组 概念 索引数组 是指键名为整数的数组。默认情况下&#xff0c;索引数组的键名是从0开始&#xff0c;并依次递增。它主要适用于利用位置&#xff08;0、1、2……&#xff09;来标识数组元素的情况。另外&#xff0c;索引数组的键名也可以自己指定 示例代码 <…

网络调优,部署内网备份冗余和负载分担---实验

目录 网络调优&#xff0c;部署内网备份冗余和负载分担---实验 拓扑 需求 配置步骤&#xff1a; 配置命令: 网络调优&#xff0c;部署内网备份冗余和负载分担---实验 拓扑 需求 主机获取IP地址&#xff0c;访问WEB服务器&#xff0c;WEB服务器网关在SW5上SW5作为VLAN10,V…

【实施】共享目录防火墙

文章目录 一、共享文件1.1 为什么需要配置文件夹共享功能1.2 配置文件夹共享功能1.3 访问共享文件1.4 普通共享和高级共享 二、安装JDK和Tomcat2.1 安装JDK2.2 安装Tomcat 三、防火墙配置 一、共享文件 1.1 为什么需要配置文件夹共享功能 我们在工作和生活中经常有需要将自己…

2024年五个大胆的网络安全预测

纵观历史&#xff0c;网络安全行业不断对攻击者的转变以及运营现实的变化做出反应&#xff0c;新的一年也不例外。随着人工智能和云计算等新技术改变网络安全格局&#xff0c;攻击者和防御者之间的猫捉老鼠游戏肯定会加剧&#xff0c;并且会变得更加复杂。 再加上其他因素&…

带你学C语言~指针(3)

目录 ✍0.前言 &#x1f680;1.字符指针变量 &#x1f685;2.数组指针变量 &#x1f431;‍&#x1f3cd;2.1.数组指针变量是什么 &#x1f431;‍&#x1f3cd;2.2数组指针变量怎么初始化 &#x1f6a2;3.二维数组传参的本质 &#x1f680;4.函数指针变量 ✈4.1函数指…

15个主流设计灵感网站,激发你的创作灵感!

即时设计 即时设计是一种强大的云设计工具&#xff0c;已成为许多设计师、产品经理和开发人员的首选工具之一。即时设计用户可以使用内置的工具和功能快速创建和编辑设计&#xff0c;或与其他用户共享和合作。此外&#xff0c;即时设计还有一个丰富的资源社区&#xff0c;为用…

制造业数字化转型的核心不止是技术

一、制造业的数字化转型意味着什么&#xff1f; 在当今的制造业领域&#xff0c;数字化转型意味着通过集成数字技术来增强传统的制造方法、产品和劳动力的过程。这些技术包括一系列创新&#xff0c;如自动化软件、电子商务系统、传感器、工业机器人等。 二、制造业数字化转型的…

ubuntu 安装apisix -亲测可用

官方未提供在ubuntu系统中安装apisix的方式&#xff0c;似乎只能通过源码方式安装&#xff0c;但是并不推荐&#xff0c;非常容易失败&#xff0c; 具体操作方式如下&#xff1a; ubuntu和Debian其实类似的&#xff0c;可使用DEB方式安装&#xff0c;如下截图 注意&#xff1…

22000mAh 电池,这款国产新机来了场「续航」震撼

见惯了主流智能手机&#xff0c;是时候上一波离谱新机震撼了。 三防手机这一细分类型&#xff0c;咱们普通用户可能接触得比较少&#xff1b; 但对于极限运动、野外探险爱好者来说&#xff0c;这玩意儿可是关键时候能救命的必备神器。 在真正严苛环境面前&#xff0c;性能啥的…

《Vue2.X 进阶知识点》- 防 ElementUI Divider 分割线

前言 使用 el-divider 背景为白色是没问题的。 但当背景换成其它颜色&#xff0c;问题就出现了&#xff01;&#xff01; 仔细看原来是两层&#xff0c;默认背景色是白色。 想着把背景色改为透明应该能用&#xff0c;结果发现背面是一条实线&#xff0c;难怪要用白色遮挡…不符…

使用LLaMA-Factory微调ChatGLM3

1、创建虚拟环境 略 2、部署LLaMA-Factory &#xff08;1&#xff09;下载LLaMA-Factory https://github.com/hiyouga/LLaMA-Factory &#xff08;2&#xff09;安装依赖 pip3 install -r requirements.txt&#xff08;3&#xff09;启动LLaMA-Factory的web页面 CUDA_VI…

HarmonyOS4.0系统性深入开发05ArkTS卡片运行机制

ArkTS卡片运行机制 实现原理 图1 ArkTS卡片实现原理 卡片使用方&#xff1a;显示卡片内容的宿主应用&#xff0c;控制卡片在宿主中展示的位置&#xff0c;当前仅系统应用可以作为卡片使用方。卡片提供方&#xff1a;提供卡片显示内容的应用&#xff0c;控制卡片的显示内容、…

ElasticSearch 聚合统计

聚合统计 度量聚合&#xff1a;求字段的平均值&#xff0c;最小值&#xff0c;最大值&#xff0c;总和等 桶聚合&#xff1a;将文档分成不同的桶&#xff0c;桶的划分可以根据字段的值&#xff0c;范围&#xff0c;日期间隔 管道聚合&#xff1a;在桶聚合的结果上执行进一步计…