题目大意:
统计最大组的数目
给你一个整数 n 。请你先求出从 1 到 n 的每个整数 10 进制表示下的数位和(每一位上的数字相加),然后把数位和相等的数字放到同一个组中。
请你统计每个组中的数字数目,并返回数字数目并列最多的组有多少个。
示例 1:
输入:n = 13 输出:4 解释:总共有 9 个组,将 1 到 13 按数位求和后这些组分别是: [1,10],[2,11],[3,12],[4,13],[5],[6],[7],[8],[9]。总共有 4 个组拥有的数字并列最多。
示例 2:
输入:n = 2 输出:2 解释:总共有 2 个大小为 1 的组 [1],[2]。
示例 3:
输入:n = 15 输出:6
示例 4:
输入:n = 24 输出:5
提示:
1 <= n <= 10^4
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1399
解题思路分析:
- 循环一遍数组,计算出每个数字的数位和
- 使用HashMap,将数位和相同的数字分在一组,key为数位和,value为数位和为该值的数字个数
- 找出数字最多的组中数字个数maxCount
- 找出所有元素为maxCount的组的个数,返回该个数
关于求位数和的方法,我们在之前的文章中多次介绍过,你可以参照文章LEETCODE常用小知识点总结 中 取得十进制数字上的每一位 的方法介绍,这里就不再啰嗦了。
另外本题有一处可以优化的地方,解题时,我们可以使用数组来替代HashMap,由于题目给出n的范围在10的4次方以内,因此最大数字不会超过1万,对于10000以内的数字,位数和最大的数字肯定是9999,它的位数和是36,因此我们定义一个长度为37(下标0-36)的数组来替代HashMap,数组下标代表位数和,数组的值为等于该位数和的数字个数。
实现代码:
public int countLargestGroup(int n) { int maxCount=0; int[] countArr = new int[37]; for(int i=1;i<=n;i++){ int num = i; int sum=0; while(num>0){ sum+=num%10; num/=10; } countArr[sum]++; maxCount=Math.max(maxCount,countArr[sum]); } int res=0; for(int i=0;i<37;i++){ if(countArr[i]==maxCount)res++; } return res; }
本题解法执行时间为6ms。
Runtime: 6 ms, faster than 76.43% of Java online submissions for Count Largest Group.
Memory Usage: 38.5 MB, less than 100.00% of Java online submissions for Count Largest Group.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1399-count-largest-group-解题思路分析/