我正在研究以下codingbat问题:
返回数组中数字的总和,除了忽略以6开头并延伸到下一个7的数字部分(每6个后跟至少一个7).返回0表示没有数字.
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
我完全知道这不是最好的解决方案,但我很想知道为什么这是错误的.你能解释一下为什么这是错的,在哪种特殊情况下它会给出错误的结果?
以下是我的解决方案供您参考:
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)
好吧,你的程序有一个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: ...)的元素.
| 归档时间: |
|
| 查看次数: |
11769 次 |
| 最近记录: |