题目如下:
你在一家生产小球的玩具厂工作,有 n 个小球,编号从 lowLimit 开始,到 highLimit 结束(包括 lowLimit 和 highLimit ,即 n == highLimit - lowLimit + 1)。另有无限数量的盒子,编号从 1 到 infinity 。
你的工作是将每个小球放入盒子中,其中盒子的编号应当等于小球编号上每位数字的和。例如,编号 321 的小球应当放入编号 3 + 2 + 1 = 6 的盒子,而编号 10 的小球应当放入编号 1 + 0 = 1 的盒子。
给你两个整数 lowLimit 和 highLimit ,返回放有最多小球的盒子中的小球数量。如果有多个盒子都满足放有最多小球,只需返回其中任一盒子的小球数量。
1 <= lowLimit <= highLimit <= 10^5
这道题力扣官方给的题解是用哈希表来暴力求解,但是我在看完数据范围后,有了一点小想法,能不能不用哈希表,就只是用数组来解答呢。答案是可以的。我的思路如下:
由于这道题规定了highLimit最大值是十的五次方,所以我们要使用的最大的盒子编号就是第99999号小球要放入的盒子的编号,即45,因此我们可以创建一个长度为46的数组(因为编号是从1号开始的),代表着这些盒子。如此一来的话,每次都可以求出这个小球应该放入哪个盒子,然后让对应的盒子加一就可以了。
var countBalls = function(lowLimit, highLimit) {
let ret = new Array(46).fill(0);
let num,sum;
for(let i=lowLimit;i<=highLimit;i++){
num = i;
sum = 0;
while(num!=0){
sum = sum+num%10;
num = (num - num%10)/10;
}
ret[sum]++;
}
return Math.max(...ret);
};
提交后结果如下
可以看见,虽然也是暴力解法,但是由于数据范围限制,结果还是很不错的。