「这是我参与2022首次更文挑战的第18天,活动详情查看: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" 是固定的,所以我们可以直接新建一个哈希表,将所有用到的字母保存进去,记录下每一个字母当前的个数,一旦满足了拼凑一个单词的要求,就将哈希表中的个数减去,并且答案加一。
- 首先我们先新建哈希表,并且存入对应的字母和个数为0.
let map = new Map([
["b", 0],
["a", 0],
["l", 0],
["o", 0],
["n", 0],
]);
- 循环遍历字符串,并且将碰到的需要的字母存进哈希表。
for (i in text) {
if (map.has(text[i])) {
map.set(text[i], map.get(text[i]) + 1);
}
}
- 每次存入之后就去判断当前的字母个数能不能组成单词,可以的话就减去对应的数量并且答案加一。
if (
map.get("b") >= 1 &&
map.get("a") >= 1 &&
map.get("l") >= 2 &&
map.get("o") >= 2 &&
map.get("n") >= 1
) {
ans++;
map.set("b", map.get("b") - 1);
map.set("a", map.get("a") - 1);
map.set("l", map.get("l") - 2);
map.set("o", map.get("o") - 2);
map.set("n", map.get("n") - 1);
}
将上述组合后就是最后的答案,本以为
/**
* @param {string} text
* @return {number}
*/
var maxNumberOfBalloons = function (text) {
let ans = 0;
let map = new Map([
["b", 0],
["a", 0],
["l", 0],
["o", 0],
["n", 0],
]);
for (i in text) {
if (map.has(text[i])) {
map.set(text[i], map.get(text[i]) + 1);
}
if (
map.get("b") >= 1 &&
map.get("a") >= 1 &&
map.get("l") >= 2 &&
map.get("o") >= 2 &&
map.get("n") >= 1
) {
ans++;
map.set("b", map.get("b") - 1);
map.set("a", map.get("a") - 1);
map.set("l", map.get("l") - 2);
map.set("o", map.get("o") - 2);
map.set("n", map.get("n") - 1);
}
}
return ans;
};
优化
本题用哈希表来保存数据有点浪费,因为题目给的单词是定死的,所以可以直接声明对应数量的变量,并且后面的判断也不需要每个都去判断,我们只要将特定的两个需要两个的字母拿出来除以2,这样就只要去判断所以变量中最小的那一个,就是能够组成的单词数量:
/**
* @param {string} text
* @return {number}
*/
var maxNumberOfBalloons = function(text) {
let b = 0, a = 0, l = 0, o = 0, n = 0
for(let i = 0; i < text.length; i++){
switch(text.charAt(i)){
case 'a':
a++
break
case 'b':
b++
break
case 'l':
l++
break
case 'o':
o++
break
case 'n':
n++
break
default:
continue
}
}
return Math.min(a, b, Math.floor(l / 2), Math.floor(o / 2), n)
};