求解LeetCode银行存钱问题时Python代码出错,请求排查
LeetCode存钱问题调试与修正
题目描述
Hercy想要为他的第一辆车存钱,他每天都往LeetCode银行里存钱。
第一天是周一,他存入1美元。从周二到周日,每天存入的钱比前一天多1美元。每个后续的周一,存入的钱比前一个周一多1美元。
给定n,返回第n天结束时他在LeetCode银行的总存款额。
示例1:
输入:n = 4
输出:10
解释:第4天结束后,总存款为1 + 2 + 3 + 4 = 10。
问题现象
输入n=4时,代码输出为6,调试发现i=4未被计入总金额。
原代码
class Solution(object): def totalMoney(self, n): amount = 0 i=1 while i < n: amount +=i i+=1 return amount if __name__ == '__main__': n=4 print(Solution().totalMoney(n))
问题分析
循环条件错误:当前循环条件是
while i < n,当i等于n时会直接跳出循环,导致最后一天的存款没被累加。比如n=4时,i=4不满足i<4,所以不会执行amount +=i,总金额少加了4,结果变成1+2+3=6。逻辑不符合题目规则:原代码只是简单累加1到n,但题目实际是每周一的存款比上周一多1,比如第8天(第二周周一)存2美元,第9天存3美元,以此类推。原代码只适用于n≤7的情况,超过7天后结果会完全错误。
修正方案
第一步:修复循环条件
把循环条件改为while i <= n,确保最后一天的金额被计入:
class Solution(object): def totalMoney(self, n): amount = 0 i=1 while i <= n: amount +=i i+=1 return amount if __name__ == '__main__': n=4 print(Solution().totalMoney(n))
此时输入n=4会输出正确的10,但这只是解决了示例的问题,还需要实现题目真正的存钱逻辑。
第二步:实现正确的存钱逻辑
根据题目规则,我们可以计算完整的周数和剩余天数:
- 完整周数:
weeks = n // 7 - 剩余天数:
days = n % 7 - 每一周的总金额是等差数列,第一周总和28,每周比前一周多7
- 剩余天数的存款从
weeks+1开始,连续加days天
修正后的完整代码:
class Solution(object): def totalMoney(self, n): weeks = n // 7 days = n % 7 # 计算完整周的总和:首项28,公差7的等差数列求和 total_weeks = weeks * 28 + 7 * weeks * (weeks - 1) // 2 # 计算剩余天数的总和:首项weeks+1的连续days项求和 total_days = days * (weeks + 1) + days * (days - 1) // 2 return total_weeks + total_days if __name__ == '__main__': n=4 print(Solution().totalMoney(n)) # 输出10 n=8 print(Solution().totalMoney(n)) # 输出28
内容的提问来源于stack exchange,提问作者vilnius19
相关产品推荐
相关产品推荐

