[路飞]_leetcode 1189. “气球” 的最大数量

195 阅读2分钟

「这是我参与2022首次更文挑战的第26,活动详情查看:2022首次更文挑战

1189. “气球” 的最大数量

给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。

字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。

示例 1:

输入:text = "nlaebolko"
输出:1

image.png

示例 2:

输入:text = "loonbalxballpoon"
输出:2

image.png

示例 3:

输入:text = "leetcode"
输出:0  

提示:

1 <= text.length <= 10^4
text 全部由小写英文字母组成

分析

首先我们可以分析气球这个单词balloon时有五个字母所组成的,分别是balon。我们可通过遍历字符串来统计这些单词出现的次数。找出次数中出现数量最少的那一个就是“气球” 的最大数量。但是我们需要注意气球这个单词balloon中的lo是需要2个的而其他字母只需要一个,这里我们只需要将lo次数除以2并向上取整即可。

在提示中1 <= text.length <= 10^4,这说明text的长度偏大需要注意我们实现的方式要尽量避免出现多层嵌套循环。而我们分析的实现方式只需要一次循环就能统计各个字母的出现,所以说我们的实现方式是可行。

逐步实现

首先我们先定义arr用于统计每个字母出现的次数。当前气球balloon这个单词的字母有五种所有我们可以初始化数组长度为5new Array(5)并通过fill(0)将其出现次数默认都填充为0。

 const arr = new Array(5).fill(0);

我们通过for of对字符串text进行遍历。遍历时判断各字母出现的次数并使对应位置的数量+1。这样需要强调一下我们只需要统计balon这我种字母。

for (const ch of text) {
       if (ch === 'b') {
            arr[0]++;
        } else if (ch === 'a') {
            arr[1]++;
        } else if (ch === 'l') {
            arr[2]++;
        } else if (ch === 'o') {
            arr[3]++;
        } else if (ch === 'n') {
            arr[4]++;
        }
    }

我们需要对lo字母对应的出现次数进行处理,将各自出现次数除以2并向上取整(Math.floor)。

arr[2] = Math.floor(arr[2] / 2);
arr[3] = Math.floor(arr[3] / 2);

通过Math.min与扩展运算符就能求出出现最少次数的个数,这就是我们最终结果“气球” 的最大数量。

Math.min(...arr);

代码实现

/**
 * @param {string} text
 * @return {number}
 */
var maxNumberOfBalloons = function(text) {
    const arr = new Array(5).fill(0);
    for (const ch of text) {
       if (ch === 'b') {
            arr[0]++;
        } else if (ch === 'a') {
            arr[1]++;
        } else if (ch === 'l') {
            arr[2]++;
        } else if (ch === 'o') {
            arr[3]++;
        } else if (ch === 'n') {
            arr[4]++;
        }
    }
    arr[2] = Math.floor(arr[2] / 2);
    arr[3] = Math.floor(arr[3] / 2);
    return Math.min(...arr);
};