LeetCode 1716题Java代码等差数列求和逻辑错误排查求助
问题排查:等差数列求和函数
weekCalc计算错误 问题背景
Hercy为购买第一辆车存钱,他每天向LeetCode银行存钱:周一第一天存1美元,周二到周日每天比前一天多存1美元,后续每个周一比前一个周一多存1美元。给定n,返回第n天结束时的总存款。
问题描述
尝试用等差数列(AP)求和思路解决LeetCode 1716题,但weekCalc函数存在计算错误:调用weekCalc(1,5)时,预期输出15,实际得到12。需要排查该函数的问题原因。
错误原因分析
weekCalc函数存在两个核心问题:
- 公式运算顺序错误:正确的等差数列求和公式是
总和 = n * (2*首项 + (n-1)*公差) / 2(公差为1时可简化为n*(2a +n-1)/2),你写的(n/2)*(2*a +n-1)会先执行整数除法。 - 整数截断问题:当n为奇数时(比如n=5),Java中
n/2会直接截断小数部分,5/2得到2,代入计算后结果为2*(2*1+5-1)=12,和正确结果15产生偏差。
修复后的代码
public class Practice { public static int weekCalc (int a , int n){ // a - 每周起始存款金额 //n - 天数 int c = n * (2*a + n - 1) / 2; return c; } public static int total (int n ){ int sum = 0; if (n<=7){ sum += weekCalc(1, n); } else { int num = n/7; for (int i =1 ; i<= num; i++){ sum += weekCalc(i, 7); } int d = n%7; sum += weekCalc(num +1, d); } return sum ; } public static void main (String args[]){ int ans = total(5); System.out.println(ans); // 现在输出正确的15 } }
额外优化建议
你可以将total方法中的循环替换为等差数列求和公式,避免循环提升效率:
完整num周的存款总和本身也是一个等差数列:第一周总和28,第二周35,公差为7。用公式num * (2*28 + (num-1)*7) / 2即可直接计算出完整周的总和,无需循环累加。
内容的提问来源于stack exchange,提问作者Shruti
相关产品推荐
相关产品推荐

