leetcode刷题记录-1189. “气球” 的最大数量 简单模拟

182 阅读2分钟

「这是我参与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" 是固定的,所以我们可以直接新建一个哈希表,将所有用到的字母保存进去,记录下每一个字母当前的个数,一旦满足了拼凑一个单词的要求,就将哈希表中的个数减去,并且答案加一。

  1. 首先我们先新建哈希表,并且存入对应的字母和个数为0.
 let map = new Map([
    ["b", 0],
    ["a", 0],
    ["l", 0],
    ["o", 0],
    ["n", 0],
  ]);

image.png

  1. 循环遍历字符串,并且将碰到的需要的字母存进哈希表。
 for (i in text) {
    if (map.has(text[i])) {
      map.set(text[i], map.get(text[i]) + 1);
    }
  }
  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);
}

image.png

将上述组合后就是最后的答案,本以为

/**
 * @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;
};

image.png

优化

本题用哈希表来保存数据有点浪费,因为题目给的单词是定死的,所以可以直接声明对应数量的变量,并且后面的判断也不需要每个都去判断,我们只要将特定的两个需要两个的字母拿出来除以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)
};

image.png