数组最大商计算代码错误排查:输出15而非8的问题
数组最大商代码错误排查
问题回顾
给定N个整数的数组A,可以任意交换元素位置,要计算数组的最大商,规则是:
- 先算数组所有元素的总和X;
- 构造前缀和数组
pre[],pre[i]是前i+1个元素的和(索引从0开始); - 数组商是把每个i从0到N-1的
Math.floor(X/pre[i])加起来的总和。
样例输入是N=3,数组[1,1,3],正确输出应该是8,但你的JavaScript代码跑出来是15,问题出在这儿:
正确计算过程
先算总和X=1+1+3=5。要拿到最大商,得把数组升序排列(这样前缀和增长最慢,每个pre[i]尽可能小,对应的Math.floor(X/pre[i])就会尽可能大),这时前缀和数组是[1,2,5],加起来就是:Math.floor(5/1) + Math.floor(5/2) + Math.floor(5/5) = 5 + 2 + 1 = 8,这就是正确结果。
错误原因分析
你输出的15正好是5*3,也就是X乘以数组长度,说明代码肯定犯了这个核心错误:
- 根本没按规则构造前缀和数组,也没做
Math.floor(X/pre[i])的计算,直接把结果写成了X乘以数组的长度; - 或者循环的时候,每次不是加
Math.floor(X/pre[i]),而是直接加X,循环3次就得到5+5+5=15。
另外提一句,要是代码没给数组升序排序,最多是结果比8小,不会得到15,所以这不是这次输出错误的原因。
内容的提问来源于stack exchange,提问作者KUMAR GAURAV
相关产品推荐
相关产品推荐

