开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
疯狂星期三,今天一回来就是打开deBug之旅,点个咖啡给老婆庆祝一下100天的结婚纪念
盒子中小球的最大数量
该题出自力扣的1742题 —— 盒子中小球的最大数量【简单题】
审题
有 n 个小球,编号从 lowLimit 开始,到 highLimit 结束(包括 lowLimit 和 highLimit ,即 n == highLimit - lowLimit + 1)。另有无限数量的盒子,编号从 1 到 infinity 。 给你两个整数 lowLimit 和 highLimit ,返回放有最多小球的盒子中的小球数量。如果有多个盒子都满足放有最多小球,只需返回其中任一盒子的小球数量。
- 这道题的题意虽然有点绕,但是理解以后,拆分成小问题,还是很好理解的
- 给出两个整数,相当于一个区间,在这个区间内,计算每个数的每位数之和,并最终返回出现的最多次数
- 那么就可以对该题进行拆分
- 在lowLomit到highLimit的区间内,进行遍历
- 对每个数的位数之和进行计算
- 计算出出现次数最多的盒子数
- 利用HashMap进行位数的存储,也就是出现的盒子,因为用例是10的5次方,最多就是5个9的相加,也就是45,那么开辟一个50长度的HashMap
- 对每个数的位数之和进行计算,利用除数和取余的计算
- 利用一个变量,对每次的最大值做一次最大计算
- Hash来存储出现的最值情况,但是效率相当低。
编码
class Solution {
public int countBalls(int lowLimit, int highLimit) {
HashMap<Integer,Integer> map = new HashMap<>(50);
int max = 0;
for (int i = lowLimit; i <= highLimit; i++) {
int result = sum(i);
Integer orDefault = map.getOrDefault(result,0) + 1;
map.put(result,orDefault);
max = Math.max(max,orDefault);
}
return max;
}
private int sum(int i) {
int index = 0;
while (i != 0){
index += i%10;
i/=10;
}
return index += i;
}
}