:数位求和与计数桶数组实战)
LeetCode 1742. Maximum Number of Balls in a Box 题解LeetCode-Go数位求和与计数桶数组实战【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读本篇基于 LeetCode-Go 仓库中 1742.Maximum-Number-of-Balls-in-a-Box 目录 的题解文档深入讲解 LeetCode 第 1742 题「Maximum Number of Balls in a Box」的完整解题思路、Go 语言实现与复杂度分析。读完本文你将掌握「数位求和 固定大小计数数组」这一经典计数类题目的标准解法并能理解为何桶数组要开 46 个槽位、如何结合仓库中的源码与测试用例进行本地验证与复现。一、题目回顾英文原题工厂中有编号从lowLimit到highLimit含两端的n个小球其中n highLimit - lowLimit 1另有编号从1到无穷大的无限多个盒子。工作规则是将每个小球放入编号等于该球编号各位数字之和的盒子中。例如小球编号321其各位数字和为3 2 1 6应放入 6 号盒子小球编号10其各位数字和为1 0 1应放入 1 号盒子。给定两个整数lowLimit和highLimit返回放球最多的盒子中的小球数量若有多个盒子并列最多返回该数量即可。约束条件Constraints1 lowLimit highLimit 10^5二、题目大意中文理解把问题翻译成直白的计数语言我们需要对区间[lowLimit, highLimit]内的每一个整数计算其十进制各位数字的和并统计「每个数位和对应多少个数字」。数位和在这里充当了「盒子编号」而问题要求的就是出现次数最多的那个数位和所对应的出现次数。换句话说本题本质是对区间内所有整数的数位和做频率统计求最大频率。三、示例逐帧推演示例 1lowLimit 1, highLimit 10各球编号 → 数位和盒子号如下球编号12345678910盒子号数位和1234567891对应盒子的球数1 号盒子有 2 个球编号 1 和 1029 号盒子各 1 个球。最多小球数为2。示例 2lowLimit 5, highLimit 15球编号56789101112131415盒子号数位和567891234565 号盒子和 6 号盒子各有 2 个球其余盒子各 1 个球并列最多。最多小球数为2。示例 3lowLimit 19, highLimit 28球编号19202122232425262728盒子号数位和10234567891010 号盒子有 2 个球编号 19 和 2829 号盒子各 1 个球。最多小球数为2。三个示例均印证了「求数位和最大频率」的核心语义。四、解题思路数位求和 固定大小计数桶原文档给出的思路十分精炼循环遍历一遍数组依次计算出所有小球的编号各位数字累加和并动态维护放有小球最多的数目。循环结束输出最多小球个数即可。把这句话拆解为三个步骤数位求和对区间内每个整数i反复执行i % 10取最低位、i / 10去掉最低位累加得到数位和t计数以数位和t作为桶下标执行buckets[t]动态维护最大值每次递增后比较buckets[t]与当前最大值maxBall实时更新。关键细节桶数组为什么是 46 个槽位这是本题最值得深挖的实现细节。源码中桶数组声明为[46]int其依据来自约束条件highLimit 10^5区间内最大的数是100000但在它之前的99999拥有区间内最大的数位和9 9 9 9 9 45因此所有可能的数位和取值范围是[1, 45]再加上不会被用到的下标0数组需要覆盖索引0..45共 46 个槽位由于lowLimit 1小球编号最小为 1数位和至少为 1所以 0 号槽位永远不会被使用但它作为数组下标的自然成员被保留避免了越界。这个边界分析直接决定了数组大小的选取如果约束扩大到10^9数位和上限将变为 81999999999的数位和数组就应相应扩为[82]int。为什么用数组而不是 map零分配、零哈希开销固定数组在编译期即可确定大小读写均为 O(1) 且无扩容、无哈希碰撞确定性大小如上分析数位和的取值范围可被严格界定天然适合用定长数组代码简洁buckets[t]一行即可完成计数配合maxBall的实时比较无需在循环结束后再扫描整个桶数组求最大值。五、Go 实现仓库源码逐行讲解以下代码完整摘录自仓库源码文件 1742. Maximum Number of Balls in a Box.go与题解文档 README.md 中给出的代码完全一致package leetcode func countBalls(lowLimit int, highLimit int) int { buckets, maxBall : [46]int{}, 0 for i : lowLimit; i highLimit; i { t : 0 for j : i; j 0; { t j % 10 j j / 10 } buckets[t] if buckets[t] maxBall { maxBall buckets[t] } } return maxBall }逐行要点说明buckets, maxBall : [46]int{}, 0声明 46 个槽位的计数桶对应数位和取值0..45与当前最大球数外层for i : lowLimit; i highLimit; i遍历区间内每一个小球编号注意使用确保highLimit本身也被处理内层循环for j : i; j 0; { t j % 10; j j / 10 }通过「取模 整除」逐位剥离十进制数字并累加当i本身大于 0约束保证lowLimit 1时内层循环必然至少执行一次buckets[t]数位和为t的球落入t号盒子计数加一if buckets[t] maxBall { maxBall buckets[t] }就地比较更新最大值省去循环结束后的二次扫描。复杂度分析时间复杂度O(n·d)。其中n highLimit - lowLimit 1 10^5d为十进制位数由于highLimit 100000d 6因此最坏情况下也仅约6 × 10^5次基础运算属于线性级别、常数极小的实现空间复杂度O(1)。无论区间多大计数桶始终是固定 46 个int槽位不随输入规模增长。六、仓库测试与本地验证仓库为本题配套了单元测试文件 1742. Maximum Number of Balls in a Box_test.go采用了本仓库统一的question1742含para1742参数与ans1742期望答案测试结构覆盖了题解文档中的全部三个官方示例用例lowLimithighLimit期望输出1110225152319282测试函数Test_Problem1742通过countBalls(p.lowLimit, p.highLimit)调用被测函数并按【input】:%v 【output】:%v的格式打印每组输入与输出。在仓库根目录执行以下命令即可复现全部测试该命令模式与仓库根目录的 gotest.sh 脚本中go test ... ./leetcode/...的包匹配方式保持一致go test -v -run Test_Problem1742 ./leetcode/...运行前提本地已安装 Go 工具链仓库 go.mod 声明的最低版本为go 1.19且已在仓库根目录下执行。由于仓库leetcode/下各题解子目录均以package leetcode组织使用./leetcode/...通配匹配可避免目录名中空格与点号带来的路径转义问题。若需生成整体覆盖率报告覆盖全部题解目录可直接复用仓库自带的脚本bash gotest.sh该脚本会以-covermodeatomic模式对./leetcode/...下所有包执行测试并产出coverage.txt覆盖率文件。七、边界情况与扩展思考边界情况lowLimit highLimit区间只有一个球其数位和对应的盒子球数为 1返回 1跨过整百/整千边界如示例 3 中从19到20数位和从10骤降为2说明数位和在相邻整数之间不具备单调性不能通过增量推导前一球的数位和来优化例如9 → 10数位和从9变为1因此「每个数独立逐位求和」是本问题的标准做法最大数位和边界当highLimit 100000时区间内最大数位和为 45来自9999946 槽数组恰好覆盖不会越界若约束变化需按第四节所述同步调整数组大小。扩展思考解法变体也可用strconv.Itoa(i)转字符串后逐字符累加但相比纯算术取模字符串方案引入了分配与转换开销在10^5规模的循环中并非更优同类题型迁移本题是「散列/桶计数」类问题的入门模板其「以某个可计算的属性值作为桶下标、动态维护极值」的框架可平移到统计数字出现频次、按某规则分组计数等场景若输出要求变化如果题目改为返回「球最多的盒子编号」只需在维护maxBall的同时记录对应的下标t即可整体思路不变。八、小结LeetCode 1742 是一道典型的简单计数题其核心在于两步把「盒子编号」抽象为「十进制数位和」以及用定长数组充当计数桶并在遍历中动态维护最大值。本文结合 LeetCode-Go 仓库中的题解文档、源码与测试用例完整还原了countBalls的推导过程与实现细节并给出了可在本地一键复现的验证命令。对初学者而言本题是理解「数位分解 桶计数」组合拳的低门槛范本对复习者而言46 槽位数组的来源分析则提供了从约束反推数据结构的经典示例。仓库中的相关文件可进一步参考题解文档Go 源码实现单元测试项目测试脚本项目模块配置【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考