CodingBat Python 测试结果为“超时”
我正在尝试解决这个CodingBat的问题:
我们想要制作一个目标重量为目标公斤的巧克力包。我们有小巧克力棒(每根1公斤)和大巧克力棒(每根5公斤)。假设我们总是先使用大巧克力棒,再使用小巧克力棒,请返回需要使用的小巧克力棒的数量。如果无法完成这个目标,请返回-1。
我明白这个问题的逻辑,但是每当我尝试运行代码时,总是出现超时异常。有人能告诉我我哪里做错了吗?
def make_chocolate(small, big, goal):
total = 0
if goal < 5:
big = 0
for i in xrange(big):
total += 5
if total == goal:
return 0
elif total+5>goal:
break
for k in xrange(small):
total +=1
if total == goal:
return (k+1)
return -1
15 个回答
0
你可以简单地这样做:
def make_chocolate(small, big, goal):
noOfBigs = big if(5 * big <= goal) else goal / 5
return goal - (noOfBigs * 5) if small >= (goal - (noOfBigs * 5)) else -1
0
这个方法虽然有点笨重,但确实能奏效:
def make_chocolate(small, big, goal):
bigbars=goal//5
if bigbars<=big:
smallgoal=goal-(bigbars*5)
if smallgoal>=0 and smallgoal<=small:
return smallgoal
if smallgoal>small:
return -1
if bigbars>big:
smallgoal=goal-(big*5)
if smallgoal<=small:
return smallgoal
if smallgoal>small:
return -1
3
这个失败是因为测试所花的时间太长了:
makeChocolate(1000, 1000000, 5000006)
即使其他测试都能通过,但只要有一个测试超时,报告就会显示所有测试都超时。要验证这一点,可以把 xrange(big)
改成 xrange(big if big < 101 else 0)
,这样你会发现除了上面的那个测试,其他所有测试都能通过。
基于网页的评估工具需要这样的超时设置来保证性能。这意味着Python的超时设置允许的循环次数比Java的要少。
这里有一个不需要循环的解决方案,可以通过测试:
def make_chocolate(small, big, goal):
big *= 5
if big + small < goal or small < goal%5:
return -1
small = goal - big
return small%5 if small < 0 else small
由于Java对负数的取模处理方式不同,所以需要一个稍微不同的解决方案。
public int makeChocolate(int small, int big, int goal) {
big *= 5;
if (big + small < goal || small < goal%5)
return -1;
small = goal - big;
return small < 0 ? (big+small)%5 : small;
}