------持续更新蓝桥杯入门系列算法实例--------
如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流!
你的点赞、关注、评论、是我创作的动力!
-------希望我的文章对你有所帮助--------
前言:最近可能有点忙,在着手课程设计以及备考六级,上次六级不够理想,再刷刷分哈哈
关于蓝桥杯校模拟赛二期,也会尽快去做以及出题解,欢迎支持!
目录
一、题目描述
你在一家生产小球的玩具厂工作,有 n
个小球,编号从 lowLimit
开始,到 highLimit
结束(包括 lowLimit
和 highLimit
,即 n == highLimit - lowLimit + 1
)。另有无限数量的盒子,编号从 1
到 infinity
。
你的工作是将每个小球放入盒子中,其中盒子的编号应当等于小球编号上每位数字的和。例如,编号 321
的小球应当放入编号 3 + 2 + 1 = 6
的盒子,而编号 10
的小球应当放入编号 1 + 0 = 1
的盒子。
给你两个整数 lowLimit
和 highLimit
,返回放有最多小球的盒子中的小球数量。如果有多个盒子都满足放有最多小球,只需返回其中任一盒子的小球数量。
示例 1:
输入:lowLimit = 1, highLimit = 10 输出:2 解释: 盒子编号:1 2 3 4 5 6 7 8 9 10 11 ... 小球数量:2 1 1 1 1 1 1 1 1 0 0 ... 编号 1 的盒子放有最多小球,小球数量为 2 。
示例 2:
输入:lowLimit = 5, highLimit = 15 输出:2 解释: 盒子编号:1 2 3 4 5 6 7 8 9 10 11 ... 小球数量:1 1 1 1 2 2 1 1 1 0 0 ... 编号 5 和 6 的盒子放有最多小球,每个盒子中的小球数量都是 2 。
示例 3:
输入:lowLimit = 19, highLimit = 28 输出:2 解释: 盒子编号:1 2 3 4 5 6 7 8 9 10 11 12 ... 小球数量:0 1 1 1 1 1 1 1 1 2 0 0 ... 编号 10 的盒子放有最多小球,小球数量为 2
提示:
1 <= lowLimit <= highLimit <=
解题思路:1、仔细阅读题目以及示例,不难发现本题其实是求一定范围的数内某个编号盒子里最多的小球数量。
2、求小球数量,即求对应盒子编号内的小球,而盒子编号即小球编号的各位数和。
例:小球787号,即在7+7+8=22号盒子上+1。
3、即此题只要分别求其各位数和即可!
4、即定义一个整型数组BallList[ ],大小为hightLimt-lowLimt+1个元素。
5、编写一个while循环作为内循环对小球编号各位求和为Sum
6、如果出现Sum,则对BallList[Sum]++
7、最后比较出现次数最多的Sum输出值即可
你以为这样就能做出来?错!!
1、在第四条数组大小上,就已经错了,会使得大部分用例无法通过,原因是数组越界!
比如求87-88,按道理是数组BallList的length应该为2,但是,Sum=15,16;即BallList[16]!
2、因此要解决数组越界问题,则需要扩大数组大小,又不能过于大而浪费内存,因为n<
3、即当n=99999时Sum最大为45,因此length+45即保证必定不会造成数组越界的问题!
机智!
二、代码实现
public static void main(String args[]){
System.out.println(countBalls(1,8888));
}
public static int countBalls(int lowLimit, int highLimit) {
int BallList[]=new int[highLimit-lowLimit+45];
for (int i=lowLimit;i<=highLimit;i++){
int sum=0;
int k=i;
while (k!=0){
sum+=k%10;//求各个位数
k/=10;
}
BallList[sum]++;//对应编号++
}
int MAX=0;
for (int i:BallList){
if(i>MAX)
MAX=i;
}
return MAX;
}
感谢爱学习的你看到了最后,关注、点赞支持一下吧!