CodingBat平台make_chocolate代码触发Timed Out超时错误原因排查
问题解答
代码是否会触发无限循环?
不会。
你给出的代码中,while循环的两个判断条件每次迭代都会被收紧:只要进入循环体,big就会被减1,而big初始为非负整数,循环最多执行big次就必然会终止,不存在无限循环的可能。
为什么CodingBat平台会抛出超时错误?
这段代码逻辑正确,但性能实现有缺陷:它采用逐次循环扣减的方式计算可使用的大巧克力数量,循环次数和大巧克力的可用数量线性相关。当平台测试用例传入的big、goal数值极大时,比如big=10^8、goal=5*10^8,代码需要执行上亿次循环才能结束,超过了CodingBat设定的单用例运行时间阈值,就会触发Timed Out报错。
你可以用数学计算直接替代循环,将时间复杂度降到O(1),即可解决超时问题:
def make_chocolate(small, big, goal): # 直接计算最多能使用的大巧克力数量 max_big_use = min(big, goal // 5) need_small = goal - max_big_use * 5 return need_small if small >= need_small else -1
内容的提问来源于stack exchange,提问作者Edward Roy
相关产品推荐
相关产品推荐

