蓝桥杯---数青蛙(leetcode第1419题)

news2025/2/11 16:07:39

文章目录

  • 1.题目重述
  • 2.例子分析
  • 3.思路分析
  • 4.思路总结
  • 5.代码解释

1.题目重述

这个题目算是模拟这个专题里面的一类比较难的题目了,他主要是使用crock这个单词作为一个整体,让我们确定:给你一个字符串,至少需要多少个青蛙进行完成鸣叫的过程,这个地方强调的是最少的青蛙的数量,为什么强调最少,通过下面对于例子的分析,你就会理解里面的原因;

2.例子分析

示例一算是一个比较完整的例子:croak算是一个完整的过程,这个时候这个青蛙叫完之后,可以继续去叫下一个croak,因此这个输入的字符串最少需要一个青蛙,这个青蛙叫两遍就可以了;

为什么会强调是最少的数量,这个例子就可以体现,因为我们可以让一个青蛙叫前面的croak,让第二个青蛙叫第二组croak,这个时候可以是两个青蛙,但是因为题目要求是最少的青蛙的数量,因此使用一个就可以了;

示例二强调的是交叉进行这个情况,就是对于一个青蛙而言,他叫的这个顺序必须是croak,因此这个示例里面标注了第一个青蛙叫的内容和第二个青蛙叫的内容,都是croak,这个时候和上面不同的地方就是这个croak不是连续的了;

这个示例里面至少就是两个青蛙,一个就不可以了,假设第一个青蛙叫:c,r,到达第三个字符c的时候,他就不可以叫了,因为上面说了,这个叫的顺序必须是croak,这个时候他本来交了cr,再出来一个c不可能再是他叫的,这个时候需要第二个青蛙;

示例三就是无法完成的一个情况,因为这个第一个青蛙叫完croak,他再去叫cro,这个时候发现下一个是o,显然不符合这个croak的顺序,因此这个就无法完成,所以返回异常值-1;

3.思路分析

下面,我是用可视化的方式展示一下这个题目的思路分析过程:

这个题目的整体的思路是使用的数组模拟哈希表,值记录的是这个字符出现的次数:刚开始的时候,指向c,因此这个数组里面的c对应的值就是1;

下面的这一步很重要,就是下一个字符是r,这个时候我们就去找c,因为一个青蛙想要叫r,前提是他必须叫c,这个时候我们上一步前面就是c,所以我们可以看下面的这个图:就是1挪到了r的这个位置;

上面的这个理解下,下面就好搞了,我们发现,走到一个非开头元素的时候,我们就要看这个数组里面是不是存在他前面的这个位置的元素:

下一个元素是c,是croak里面的开头元素,这个时候他的前面没有元素,因为他自己就是第一个,所以这个时候需要另外的一个青蛙,我们在这个对应位置填上1;

下面的元素是o。我们找croak里面o前面的元素是r,在这个数组里面是存在的,挪动一下即可;

下面的这个元素是a,在croak里面,a前面的元素是o,正好存在,所以就是挪一下即可;

接下来的元素是k,我们找的是o,存在,进行挪动,发现这个到达k了,也就是鸣叫的最后一个字符,这个时候他的一次就完成了,如果后续需要,它可以继续重复,因为他的这一次完整的过程结束了;

接下来就是r元素,我们找的是c元素,存在进行挪动,以此类推(下面的这个过程我省略了,因为接下来的元素分别是roak,都是连着顺序的,这个原理是一样的,所以我就直接划到了k,这个时候相当于两个青蛙完成了鸣叫,我们发现剩下的正好是croak一个完整的鸣叫,这个时候我们从两个两个完成鸣叫的青蛙里面任意进行选择一个完成下面的过程即可,因此这个最少数量就是2个;

4.思路总结

下面的这个就是基于上面的过程总结:

我们分为是不是第一个元素,如果是c,我们就要看看是不是有已经叫完了的青蛙,否则就需要一个新的;如果有的话,k对应的位置–,我们的c对应的位置++就可以了;

如果不是第一个元素(roak之类的),我们找前驱元素,例如,指向k的时候,我们看看是不是有青蛙叫到了a,如果有,按照上面的过程挪动就可以了(该位置++,前面的位置–,这个就是挪动涉及到的变化),如果没有就返回-1,证明这个过程无法完成,类似于示例里面的第三个情况;

5.代码解释

1)字符串转换为字符数组,tocharArray方法转换;

2)hash数组模拟上面提到的croak这个过程,挪动设计到的下标的变化;

3)HashMap是主要方便去找前驱节点,因为总结里面说了,前驱节点存在,需要前驱节点–,该位置++,HashMap里面的键值对分别表示字符t.charAt获取字符(键),对应下标(值)就是代码里面的i;

4)index就是把这个字符和他的下标绑定在一起,方便我们使用;

5)遍历这个ret字符数组,根据我们的总结里面的内容进行操作:

如果对应的是c,我们去找这个k对应的位置是不是0,也就是代码里面的n-1下标,如果不是0,这个时候n-1位置的数值–,否则我们的0下标就++;

如果对应的是roak里面的字符,也就说不是第一个,我们需要做的就是找i前面的一个元素位置的值是不是存在,存在的话,就是前驱–,该位置++;

前面的元素不存在,直接返回-1,证明字符不完整,无法鸣叫;

6)最后的for讲的是遍历croak里面的前面的四个位置对应的值是不是都是0,如果有一个不是,证明有落单的,这个就无法完成,如果出了k之外的元素对应位置都是0,说明每一个青蛙都是完成了croak的鸣叫,没有中途停留的,我们返回的就是k下标对应的值(表示的最少的青蛙的数量);

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

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

相关文章

单片机之基本元器件的工作原理

一、二极管 二极管的工作原理 二极管是一种由P型半导体和N型半导体结合形成的PN结器件,具有单向导电性。 1. PN结形成 P型半导体:掺入三价元素,形成空穴作为多数载流子。N型半导体:掺入五价元素,形成自由电子作为多…

OpenEuler学习笔记(二十三):在OpenEuler上部署开源MES系统

在OpenEuler上部署小企业开源MES(制造执行系统,Manufacturing Execution System)是一个非常有价值的项目,可以帮助企业实现生产过程的数字化管理。以下是基于开源MES系统(如 Odoo MES 或 OpenMES)的部署步骤…

ubuntu中如何在vscode的终端目录后显示(当前的git分支名) 实测有用

效果展示 配置过程: 在 Ubuntu 中,如果你想在 VS Code 的终端提示符后显示当前的 Git 分支名,可以通过修改 Shell 配置文件(如 ~/.bashrc 或 ~/.zshrc)来实现。以下是具体步骤: 1. 确定使用的 Shell 首…

从二叉树遍历深入理解BFS和DFS

1. 介绍 1.1 基础 BFS(Breadth-First Search,广度优先搜索)和 DFS(Depth-First Search,深度优先搜索)是两种常见的图和树的遍历算法。 BFS:从根节点(或起始节点)开始&am…

Kotlin协程详解——协程上下文

目录 一、上下文结构 get()获取元素 minusKey()删除元素 fold()元素遍历 plus()添加元素 CombinedContext Key 二、协程名称CoroutineName 三、上下文组合 四、协程作用域CoroutineScope 五、典型用例 协程的上下文,它包含用户定义的一些数据集合&#x…

手写一个C++ Android Binder服务及源码分析

手写一个C Android Binder服务及源码分析 前言一、 基于C语言编写Android Binder跨进程通信Demo总结及改进二、C语言编写自己的Binder服务Demo1. binder服务demo功能介绍2. binder服务demo代码结构图3. binder服务demo代码实现3.1 IHelloService.h代码实现3.2 BnHelloService.c…

Deep Dive into LLMs like ChatGPT - by Andrej Karpathy

https://www.youtube.com/watch?v7xTGNNLPyMIhttps://www.youtube.com/watch?v7xTGNNLPyMIDeep Dive into LLMs like ChatGPT - by Andrej Karpathy_哔哩哔哩_bilibilihttps://www.youtube.com/watch?v7xTGNNLPyMI转载自Andrej Karpathy Youtube ChannelThis is a general a…

react实例与总结(一)

目录 一、简单认识 1.1、特点 1.2、JSX语法规则 1.3、函数组件和类式组件 1.4、类组件三大属性state、props、refs 1.4.1、state 1.4.2、props 1.4.3、refs 1.5、事件处理 1.6、收集表单数据—非受控组件和受控组件 1.7、高阶函数—函数柯里化 1.8、生命周期—新旧…

51单片机(国信长天)矩阵键盘的基本操作

在CT107D单片机综合训练平台上,首先将J5处的跳帽接到1~2引脚,使按键S4~S19按键组成4X4的矩阵键盘。在扫描按键的过程中,发现有按键触发信号后(不做去抖动),待按键松开后,在数码管的第一位显示相应的数字:从左至右&…

STM32 RTC亚秒

rtc时钟功能实现:rtc模块在stm32内部,由电池或者主电源供电。如下图,需注意实现时仅需设置一次初始化。 1、stm32cubemx 代码生成界面设置,仅需开启时钟源和激活日历功能。 2、生成的代码,需要对时钟进行初始化,仅需…

【Linux】深入理解linux权限

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、权限是什么 二、用户和身份角色 三、文件属性 1. 文件属性表示 2. 文件类型 3. 文件的权限属性 四、修改文件的权限属性和角色 1. …

json格式,curl命令,及轻量化处理工具

一. JSON格式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于一个子集的JavaScript编程语言,使用人类易于阅读的文本格式来存储和表示数据。尽管名字中有“JavaScript”,但JSON是语言无关的,几…

web直播弹幕抓取分析 signature

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言 最近遇到太多难点了卡了很久&am…

ABP框架9——自定义拦截器的实现与使用

一、AOP编程 AOP定义:面向切片编程,着重强调功能,将功能从业务逻辑分离出来。AOP使用场景:处理通用的、与业务逻辑无关的功能(如日志记录、性能监控、事务管理等)拦截器:拦截方法调用并添加额外的行为,比如…

CUDA 计算平台 CUDA 兼容性【笔记】

在 b 站看过的两个关于 CUDA 的技术分享,整理分享下对自己有用的课件。 20231130 2023第9期 聊一聊常见的AI计算平台库_哔哩哔哩_bilibili20230831 2023第6期 聊一聊CUDA兼容性_哔哩哔哩_bilibili 文章目录 CUDA 计算平台CUDA 函数库介绍英伟达三大护城河&#xff1…

最新消息 | 德思特荣获中国创新创业大赛暨广州科技创新创业大赛三等奖!

2024年12月30日,广州市科技局公开第十三届中国创新创业大赛(广东广州赛区)暨2024年广州科技创新创业大赛决赛成绩及拟获奖企业名单,德思特获得了智能与新能源汽车初创组【第六名】【三等奖】的好成绩! 关于德思特&…

ubuntu安装VMware报错/dev/vmmon加载失败

ubuntu安装VMware报错/dev/vmmon加载失败,解决步骤如下: step1:为vmmon和vmnet组件生成密钥对 openssl req -new -x509 -newkey rsa:2048 -keyout VMW.priv -outform DER -out VMW.der -nodes -days 36500 -subj "/CNVMware/"ste…

python的列表、元组、深拷贝、浅拷贝(四)

python的列表 一、序列1. 序列定义2. 序列数据类型包括3.特点:都支持下面的特性 二、 列表1. 列表的创建2. 列表的基本特性(1) 连接操作符喝重复操作符(2) 成员操作符(in , not in )(3) 索引(4) 切片练习(5) for循环 3. 列表的常用方法(1) 一…

2.10作业

思维导图 C C语言

【深度学习】多目标融合算法(四):多门混合专家网络MMOE(Multi-gate Mixture-of-Experts)

目录 一、引言 二、MMoE(Multi-gate Mixture-of-Experts,多门混合专家网络) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、…