1.题目
2.思路
(1)用字典的方法,ballon,这个单词里面每个字母,需要的个数
(2)再创一个字典的方法统计,输入的字符串的字母的个数
(3)计算能拼凑出多少个“ballon"
(4)代码解释
for (char c : text.toCharArray()) {count.put(c, count.getOrDefault(c, 0) + 1);}
text.toCharArray():将字符串text转换为字符数组。
for (char c : text.toCharArray()):这是一个增强型for循环,遍历字符数组中的每个字符。
count.put(c, count.getOrDefault(c, 0) + 1):这行代码使用count这个Map集合来存储每个字符及其出现的次数。
c是当前遍历到的字符。
count.getOrDefault(c, 0):这个方法尝试从count中获取字符c对应的值,如果c不在count中,则返回默认值0。
- 1:将获取到的值加1,表示字符c出现的次数增加1。
count.put(c, …):将更新后的计数结果放回count中。
简单来说,这段代码会遍历字符串中的每个字符,然后统计每个字符出现的次数,并将结果存储在count这个Map集合中。如果count集合之前为空,那么每个字符的初始计数是0,然后每次出现都会增加1。
(5)举例说明:
Map<Character, Integer> required = new HashMap<>();
required.put('b', 1); // 字符'b'需要1次
required.put('a', 1); // 字符'a'需要1次
required.put('l', 2); // 字符'l'需要2次
required.put('o', 1); // 字符'o'需要1次
required.put('n', 1); // 字符'n'需要1次
在这个例子中,required.keySet()将返回一个包含{‘b’, ‘a’, ‘l’, ‘o’, ‘n’}的Set集合。这个集合包含了构成单词"balloon"所需的所有不同字符。
使用required.keySet()的目的是遍历这个集合中的每个键,以便在后续的代码中检查和计算这些字符在另一个Map(比如count)中出现的次数,进而确定能否拼凑出完整的单词"balloon"。
(6)
1) Math.min:这是一个静态方法,属于Java的Math类,用于返回两个数值中的较小值。
2)minBalloons:这是代码中的一个变量,用于存储能够拼凑出单词"balloon"所需的最少气球(或字符)数量。初始值被设置为Integer.MAX_VALUE,即int类型能表示的最大值。
3)count.get©:这是从count这个Map集合中获取键为c的值。c是当前遍历到的字符,count集合存储了每个字符在给定文本中出现的次数。
required.get©:这是从required这个Map集合中获取键为c的值。required集合存储了构成单词"balloon"所需的每个字符的最小数量。
4)count.get© / required.get©:这个表达式计算的是,对于当前字符c,给定文本中出现的次数除以构成单词"balloon"所需的最小数量。结果是每个"balloon"中字符c可以拼凑出的最大单词数。
minBalloons = Math.min(minBalloons, count.get© / required.get©);:这行代码将minBalloons更新为当前计算出的值和已有的minBalloons值中的较小值。这样做的目的是确保minBalloons始终是所有字符中能够拼凑出"balloon"的最小数量。
5)举例来说,如果count中字符’l’出现了10次,而required中字符’l’需要2次来构成一个"balloon",那么count.get(‘l’) / required.get(‘l’)的结果是5。这意味着10个’l’可以构成5个"balloon"。如果这是迄今为止找到的最小值,minBalloons将被更新为5。如果minBalloons之前已经是4,那么它将保持不变,因为4比5小,表示可以更有效地使用字符来构成"balloon"。
(7)大体思路:这段代码通过比较字符串中每个字符出现的次数与构成单词"balloon"所需的最小数量,来计算出最多能拼凑出多少个"balloon"。如果缺少任何一个字符,则无法拼凑出任何"balloon"。
3.代码实现
class Solution {public int maxNumberOfBalloons(String text) {// 原本单词 "balloon" 中各字母的需求Map<Character,Integer> orginal=new HashMap<>();orginal.put('b',1);orginal.put('a',1);orginal.put('l',2);orginal.put('o',2);orginal.put('n',1);Map<Character,Integer> cnt=new HashMap<>();// 统计输入字符串中的字母出现次数,用加强版for循环//将text的字符串转换成字符数组text.tocharArray()for(char c:text.toCharArray()){ //cnt里面统计字符出现的次数 count.put(c, count.getOrDefault(c, 0) + 1);cnt.put(c,cnt.getOrDefault(c,0)+1);}int minQiQiu=Integer.MAX_VALUE;//先设置气球的最小数量//keyset(),可以遍历original的key值,每个key暂时保存再c变量里面for(char c:orginal.keySet()){//判断当前字母c的键值是否被输入的text的字符串的键值所包含if(cnt.containsKey(c)){//计算气球的最小数量minQiQiu=Math.min(minQiQiu,cnt.get(c)/orginal.get(c));}else{return 0;}}return minQiQiu;}
}