CodingBat Python 测试结果为“超时”

2 投票
15 回答
6327 浏览
提问于 2025-04-17 20:13

我正在尝试解决这个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;
}

撰写回答