CodingBat sum67:这个解决方案为什么错了?

6 投票
31 回答
25551 浏览
提问于 2025-04-17 07:43

我正在做一个CodingBat上的题目:

这个题目的要求是:计算数组中所有数字的总和,但要忽略从6开始到下一个7之间的所有数字(每个6后面至少会有一个7)。如果数组里没有数字,就返回0。

sum67([1, 2, 2]) → 5
sum67([1, 2, 2, 6, 99, 99, 7]) → 5
sum67([1, 1, 6, 7, 2]) → 4

我的解法是:

def sum67(nums):
    sum = 0 
    throwaway = 0
    for i in range(len(nums)):
        if throwaway == 0:
            if nums[i] == 6:
                throwaway = 1
        elif throwaway == 1 and i > 0 and nums[i-1] == 7:
            throwaway = 0
        if throwaway == 0:
            sum += nums[i]
    return sum

我知道我的解法可能不是最好的,但我很好奇为什么这个解法会出错。你能告诉我为什么这样做不对吗?具体在哪种情况下会得到错误的结果?

31 个回答

1

这是我对那个问题的解决方案。之前已经有人回答过,问题出在6紧跟着7出现的情况。我用了一种稍微不同的方法来解决这个问题,所以我想把它分享出来。

def sum67(nums):
  total = 0
  i=0  
  while i < len(nums):
    if nums[i] == 6:
      while nums[i] != 7:
        i+=1
      i+=1
    if i<len(nums) and nums[i]!=6:  
      total+=nums[i]
      i+=1
  return total
5

以下是我给你们的一个参考解决方案:

def sum67(nums):
flag=False
sum=0

for num in nums:
    if(num==6):                  #Turn the flag on if the number is 6
        flag=True
        continue
    if(num==7 and flag is True): #Turn the flag Off when 7 is seen after 6
        flag=False
        continue
    if(flag is False):           #Keep on adding the nums otherwise
       sum+=num
return sum
5

好吧,你的程序有个错误。检查一下下面的结果:

print sum67([1,2,5])
print sum67([1,2,6,5,7])
print sum67([1,2,6,5,7,6,7])

这将打印出:

8
3
16 <-- wrong

如果一个7后面紧跟着一个6,你就要把这个6和后面的所有数字加起来。我不确定输入中是否允许出现多个6到7的范围,但如果允许的话,你需要修正你的算法。

这个简单的实现确实能返回正确的数字:

def sum67(nums):
    state=0
    s=0
    for n in nums:
        if state == 0:
            if n == 6:
                state=1
            else:
                s+=n
        else:
            if n == 7:
                state=0
    return s

另外,如果你没有特别的原因需要使用索引,你可以直接遍历列表中的元素(for element in list: ...)。

撰写回答