「这是我参与2022首次更文挑战的第26,活动详情查看:2022首次更文挑战」
1189. “气球” 的最大数量
给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。
字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。
示例 1:
输入:text = "nlaebolko"
输出:1
示例 2:
输入:text = "loonbalxballpoon"
输出:2
示例 3:
输入:text = "leetcode"
输出:0
提示:
1 <= text.length <= 10^4
text 全部由小写英文字母组成
分析
首先我们可以分析气球这个单词balloon时有五个字母所组成的,分别是b、a、l、o、n。我们可通过遍历字符串来统计这些单词出现的次数。找出次数中出现数量最少的那一个就是“气球” 的最大数量。但是我们需要注意气球这个单词balloon中的l与o是需要2个的而其他字母只需要一个,这里我们只需要将l与o次数除以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。这样需要强调一下我们只需要统计b、a、l、o、n这我种字母。
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]++;
}
}
我们需要对l与o字母对应的出现次数进行处理,将各自出现次数除以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);
};