CodingBat sum67:这个解决方案为什么错了?
我正在做一个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: ...
)。