给定分组数g和记录数r,如何不创建数组计算每组均分的记录数
计算方案
逻辑推导
原参考函数的分配逻辑是典型的轮询均分:从第一个组开始挨个发1条记录,发完最后一组就回到开头循环,直到所有记录发完。这个逻辑完全可以用数学计算直接出结果,不用真的建g个空数组挨个塞元素:
- 先算平均分配的基准值:把r条记录平摊到g个组,每个组最少能拿到
Math.floor(r / g)条,所有组的条数都不会低于这个值 - 再算平摊后剩下的零头:
r % g就是分完整数倍之后剩下来、不够全部分一轮的记录数,这部分会按顺序发给最靠前的r%g个组,每个组多拿1条 - 最后拼接结果即可:前
r%g个组的长度是基准值+1,剩下的组长度就是基准值
拿给出的测试用例核对完全匹配:
- g=4、r=2:基准值是0,零头是2,前2个组拿1条,后2个拿0条,输出
[1,1,0,0] - g=4、r=10:基准值是2,零头是2,前2个组拿3条,后2个拿2条,输出
[3,3,2,2]
代码实现(无分组数组创建)
直接生成结果长度数组即可,不需要创建存记录的分组结构,计算效率远高于模拟逐次插入的逻辑:
const calcGroupSizes = (g, r) => { const base = Math.floor(r / g); const extraCount = r % g; return Array.from({length: g}, (_, idx) => idx < extraCount ? base + 1 : base); } // 验证用例 calcGroupSizes(4, 2); // [1, 1, 0, 0] calcGroupSizes(4, 10); // [3, 3, 2, 2]
内容的提问来源于stack exchange,提问作者Ledaso
相关产品推荐
相关产品推荐

