算法学习网址:wansuanfa.com (玩算法的拼音)
这道题是LeetCode的第1419题:数青蛙,难度为中等。有很多网友在特斯拉的面试中遇到这题,说明这题是特斯拉常考的题。如果有去特斯拉面试的打算,最好把这题完全掌握,说不定你的笔试中就有这道题。
其中一网友说这是2023年特斯拉春招的机考题,自己想了一天终于想出来了。如果想了一天才想出来,那基本上就是没过,从他唉声叹气的语气中可以感受到应该是挂了。。。
问题描述
来源:LeetCode第1419题
难度:中等
给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
要想发出蛙鸣 "croak",青蛙必须依序输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串 croakOfFrogs 不是由若干有效的 "croak" 字符混合而成,请返回 -1 。
示例1:
输入:croakOfFrogs = "croakcroak"
输出:1
解释:一只青蛙 “呱呱” 两次
示例2:
输入:croakOfFrogs = "crcoakroak"
输出:2
解释:最少需要两只青蛙,“呱呱” 声用红体标注
第一只青蛙 "crcoakroak"
第二只青蛙 "crcoakroak"
示例3:
输入:croakOfFrogs = "croakcrook"
输出:-1
解释:给出的字符串不是 "croak" 的有效组合。
字符串中的字符只有 'c', 'r', 'o', 'a' 或者 'k'
问题分析
这题让模仿青蛙的叫声,一个完整的叫声应该是依次发出‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母,如果前一个字母比后一个字母少,是不能发出完整叫声的,比如字母’r’比’o’少,那么这种情况下就不会发出声音。
如果前一个字母比后一个字母多,比如’r’比’o’多3,那么后面有可能又多了3个字母’o’,所以有可能会发出完整的叫声,这个还需要继续判断。
所以当我们计算当前字母个数的时候,要先判断前一个字母的个数,如果前一个字母比后比一个字母数量少,直接返回-1即可。
最后还需要注意如果是完整的叫声,那么所有的字符数量必须一样,如果不一样直接返回-1,最后我们在来看下代码。
public int minNumberOfFrogs(String croakOfFrogs) {
int[] nums = new int[5];// 记录每个字符的个数。
int count = 0;// 记录需要多少只青蛙
for (char ch : croakOfFrogs.toCharArray()) {
if (ch == 'c') {
if (count > 0)// 同一只青蛙继续叫,数量减1。
count--;
nums[0]++;// 一个新的字符开始。
} else if (ch == 'r') {
if (nums[0] < ++nums[1])
return -1;
} else if (ch == 'o') {
if (nums[1] < ++nums[2])
return -1;
} else if (ch == 'a') {
if (nums[2] < ++nums[3])
return -1;
} else if (ch == 'k') {
if (nums[3] < ++nums[4])
return -1;
count++;// 到最后一个了,青蛙数量加1。
}
}
// 最后所有字符必须都相等才返回count,否则返回-1。
if (nums[0] != nums[1] || nums[0] != nums[2] ||
nums[0] != nums[3] || nums[0] != nums[4])
return -1;
return count;
}
-------------------------end-------------------------
笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解700多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。