问题:
返回数组中数字的总和,为空数组返回0。除了数字13是非常不吉利的,所以它不计算在13之后立即出现的数字也不计算。
我的代码:
def sum13(nums):
l = len(nums)
tot = 0
if l==0:
return 0
for x in range(l):
if nums[x]!=13:
if nums[x-1]!=13:
tot+=nums[x]
return tot
失败的地方:
sum13([1, 2, 2, 1, 13]) should → 6, but my code is outputting 5
sum13([1, 2, 13, 2, 1, 13]) should → 4, but my code is outputting 3
答案 0 :(得分:2)
您的问题是x
为零时的问题。 x - 1
将为-1
,因此它会获取列表的最后一个元素(13
)。要解决此问题,请不要在x - 1
为零时测试x
:
if x == 0 or nums[x-1] != 13:
在Python中,当您将负索引传递给列表时,它会向后访问其元素,因此:
>>> x = [1,2,3,4,5]
>>> x[-1]
5
>>> x[-2]
4
答案 1 :(得分:1)
以下是解决方案:
def sum13(nums):
if len(nums) == 0:
return 0
for i in range(0, len(nums)):
if nums[i] == 13:
nums[i] = 0
if i+1 < len(nums):
nums[i+1] = 0
return sum(nums)
答案 2 :(得分:1)
另一种查看方式:
def sum13(nums):
sub = 0
for i in range(len(nums)):
if nums[i] == 13 :
sub+=nums[i]
if i+1<len(nums) and nums[i+1]!=13:
sub+=nums[i+1]
return sum(nums)-sub
答案 3 :(得分:1)
列表总数,但不计算item=13
也不计算item+1
def sum13(nums):
if len(nums)==0:
return 0
if nums[-1]==13:
nums[-1]=0
for i in range(len(nums)-1):
if nums[i]==13:
nums[i]=0
nums[i+1]=0
return sum(nums)
答案 4 :(得分:1)
def sum13(nums):
result = 0
i = 0
while i < len(nums):
if nums[i] == 13:
i += 2
continue
else:
result += nums[i]
i += 1
return result
答案 5 :(得分:1)
def sum13(nums):
sum = 0
len_n = len(nums)
k = 0
while k < len_n:
if nums[k] == 13:
k += 2
else:
sum += nums[k]
k += 1
return sum
答案 6 :(得分:1)
制作列表的副本,以便原件不会更改,删除数字13的实例和紧随其后的数字,然后对结果列表求和:
def sum13(nums):
nums = nums[:]
while 13 in nums:
i = nums.index(13)
del nums[i:i+2]
return sum(nums)
这与此问题的最佳答案类似: looking for a more elegant solution to this
答案 7 :(得分:1)
def sum13(nums):
if len(nums)==0:
return 0
sum=0
for i in range(1,len(nums)):
if nums[i]==13 or nums[i-1]==13:
sum = sum
else:
sum += nums[i]
if nums[0]==13:
return sum
else:
return sum + nums[0]
启动循环形式1并在末尾添加第一个数字(如果它不是13)。
答案 8 :(得分:1)
enumerate()
可以给出索引,然后可以使用sum()
中的生成器表达式来完成。添加到列表末尾的额外0使其适用于nums[i-1]
i = 0
时的def sum13(nums):
nums += [0]
return sum(n for i, n in enumerate(nums) if n != 13 and nums[i-1] != 13)
。
{{1}}
答案 9 :(得分:1)
def sum13(nums):
count = 0
sum = 0
for i in range(len(nums)):
if nums[i] == 13 or sum == 1 :
nums[i]= 0
sum = sum + 1
count = count + nums[i]
if sum == 2:
sum = 0
if nums == []:
return 0
return coun
答案 10 :(得分:1)
def sum13(nums):
count = 0
while count < len(nums):
if nums[count] == 13:
del nums[count:count+2]
continue
count += 1
return sum(nums)
答案 11 :(得分:1)
您可以使用next()
函数而不是容易出错的索引来避免错误:
def exclude13(iterable):
it = iter(iterable)
for x in it:
if x == 13: # don't yield 13
next(it) # skip number immediately after 13
else:
yield x
print(sum(exclude13([1, 2, 2, 1, 13]))) # -> 6
print(sum(exclude13([1, 2, 13, 2, 1, 13]))) # -> 4
答案 12 :(得分:0)
def sum13(nums):
sum=0
count=0
for i in range(len(nums)):
if nums[i]!=13:
count=count-1
if count<=0:
sum=sum+nums[i]
else:
count=2
return sum
答案 13 :(得分:0)
这是我采用的一种方法,也很有效
nums = [1, 2, 2, 1, 13,2,1,2,3,13,4,5]
counter = 0
temp = []
for i in range(len(nums)):
if nums[i] == 13:
if (i+1) != len(nums) and nums[i+1] != 13:
temp.append(nums[i+1])
continue
elif (i+1) == len(nums):
continue
else:
counter = counter + nums[i]
temp_total = sum(temp)
count_total = counter - temp_total
print(count_total)
答案 14 :(得分:0)
我对问题的思考方式使我可以遍历列表-除了最后一个元素。然后,如果值是13,则下一个元素变为0。从那里-我重新加载列表-并将ALL 13替换为0。最后,我仅对列表的值求和。
def sum13(nums):
for i,x in enumerate(range(len(nums)-1)):
if (nums[x]==13):
nums[i+1]=0
nums=nums
for i,x in enumerate(nums):
if x==13: #if the element is equal to 13
nums[i]=0
return sum(nums)
答案 15 :(得分:0)
返回数组中数字的总和,对于空数组返回0。除了13号是非常不幸的数字之外,因此它不会计数,紧接在13号之后的数字也不会计数。
def sum13(nums):
nums += [0]
add=sum(j for i, j in enumerate(nums) if j != 13 and nums[i-1] != 13)
return add
答案 16 :(得分:0)
def sum13(nums):
li=[]
if nums[-1]==13:
li.append(13)
for i in range(len(nums)-1):
if nums[i]==13:
li.append(nums[i])
li.append(nums[i+1])
n=sum(nums)
return (n-sum(li))
答案 17 :(得分:0)
这也应该有效。基本上它是一个双重的 continue 语句。您可以使用 enumerate() 为每次迭代分配索引和值对。如果数字是 == 13 --> continue,则下一个迭代项应符合 elif 语句的条件,该语句也适用于 13 前面的项。 Elif 仅对索引 >= 1 的项运行(因此没有问题在 [0] 处超出范围)。
def sum13(nums):
if nums ==[]:
return 0
sum = 0
for index, val in enumerate(nums):
if nums[index] == 13:
continue
elif nums[index-1] == 13 and index > 0:
continue
else:
sum += val
return sum
答案 18 :(得分:0)
def sum13(nums):
summed=0
flag=True
index_13=0
for index, num in enumerate(nums):
if num==13:
index_13=index
flag=False
if flag==True:
summed=summed+num
if index_13+1<= len(nums)-1 and num==nums[index_13+1]:
flag=True
return summed
答案 19 :(得分:0)
def sum13(nums):
sum=0
ind13=[]
for num in nums:
if num==13:
num=0
ind13=nums.index(13)
ind13next=ind13+1
nums[ind13]=0
if nums[ind13] !=nums[-1]:
nums[ind13next]=0
sum=sum+num
else:
sum=sum+num
return sum
答案 20 :(得分:0)
这是我对此练习的解决方案!!!!
def sum13(nums):
total = 0
for i in range(len(nums)):
if (nums[i] == 13 or nums[i-1] == 13 and i != 0):
total = total
else:
total += nums[i]
return total
答案 21 :(得分:0)
当x=0
中的nums[x-1]
发生冲突时,因为如果结果为nums[0-1]
,如果它是13,则它可能不加,所以请最后检查nums[0]
。
def sum13(nums):
co=0
if len(nums)<=0:
return co
for a in range(1,len(nums)):
if nums[a]==13:
continue
elif nums[a-1]==13:
continue
else:
co=co+nums[a]
if nums[0]!=13:
co+=nums[0]
return co
答案 22 :(得分:0)
def sum13(nums):
nums2 = []
if 13 in nums:
for i in range(len(nums)-1): # the -1 is needed to avoid out of range.
if nums[i] != 13: nums2.append(nums[i])
else:
nums[i] = 0
nums[i+1] = 0
return sum(nums2)
return sum(nums)
我创建了一个单独的列表,并将我想要的数字添加到该列表中。 我通过遍历每个元素并通过for循环执行此操作,如果它不等于13那么。
当它最终等于数字13时,我会通过将其设置为零来改变该数字(nums [i] = 0)。然后我还需要通过索引(nums [i + 1] = 0)在零处设置下一个数字。所以他们从列表的总和中打折。
这不是一个完美的解决方案,但它是一个有效的解决方案。
答案 23 :(得分:0)
我以下列方式解决了这个问题。这是蛮力,但确实有效:
def sum13(nums):
count = 0
if len(nums) == 0:
return 0
for ans in range(len(nums)):
if nums[ans] == 13 and ans < len(nums)-1:
nums[ans] = 0
nums[ans+1] = 0
elif nums[ans] == 13 and ans == len(nums)-1:
nums[ans] = 0
else:
count += nums[ans]
return count
答案 24 :(得分:0)
我建议使用递归解决方案。请注意,虽然列表的索引可能超出范围,但切片会给出一个空列表而不是错误,例如如果a = [1,1,2]那么a [3]会给出错误,而[3:]给出空列表[]。
def sum13(nums):
if len(nums) == 0:
return 0
sum = sum13(nums[1:])
if nums[0] != 13:
return sum + nums[0]
if nums[0] == 13:
return sum13(nums[2:])
答案 25 :(得分:0)
当你排除之后 之后的数字时,你排除之前 13之前的数字。