特斯拉公开面试题,想了一天才想出来!

算法学习网址:wansuanfa.com (玩算法的拼音)

这道题是LeetCode的第1419题:数青蛙,难度为中等。有很多网友在特斯拉的面试中遇到这题,说明这题是特斯拉常考的题。如果有去特斯拉面试的打算,最好把这题完全掌握,说不定你的笔试中就有这道题。

其中一网友说这是2023年特斯拉春招的机考题,自己想了一天终于想出来了。如果想了一天才想出来,那基本上就是没过,从他唉声叹气的语气中可以感受到应该是挂了。。。

7fb168b5dde42adc1c3bd0fd4b228db3.png

问题描述

来源: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算法文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值