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

Wil*_*lco 5 python

我正在研究以下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
Run Code Online (Sandbox Code Playgroud)

我的解决方案是:

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
Run Code Online (Sandbox Code Playgroud)

我完全知道这不是最好的解决方案,但我很想知道为什么这是错误的.你能解释一下为什么这是错的,在哪种特殊情况下它会给出错误的结果?

Ani*_*udh 6

以下是我的解决方案供您参考:

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
Run Code Online (Sandbox Code Playgroud)


hoc*_*chl 5

好吧,你的程序有一个bug.检查以下结果:

print sum67([1,2,5])
print sum67([1,2,6,5,7])
print sum67([1,2,6,5,7,6,7])
Run Code Online (Sandbox Code Playgroud)

这将打印:

8
3
16 <-- wrong
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

此外,如果由于某些不明原因而不需要使用索引,则可以直接遍历list(for element in list: ...)的元素.