我编写了这段代码是为了从给定列表中查找缺失的正整数,但在某些情况下,它仍返回None
。
例如,给定数组A = [2, 4, 1, 5]
,该函数应返回3,因为它是连续序列(1 2 3 4 5)中缺少的元素。
我在做什么错了?
def solution(A):
i = 1
while i<len(A):
if i not in A:
return i
i += 1
答案 0 :(得分:2)
您需要注意i < len(A)
引起了一些问题。
给出以下示例:
A = [1, 2, 3, 5]
很明显,所需的答案是4
,但是您的函数给出的是None
。这是因为len(A) == 4
,因此您的循环条件是i < 4
,它实际上将i
从1枚举为3。
由于您想找出丢失的号码,因此最好在i
到达列表中最大的数字而不是列表的长度时停止循环,所以:
while i < max(A):
是正确的。
答案 1 :(得分:1)
似乎工作正常。这是另一种选择:
def solution(A):
a = set(A)
for i, _ in enumerate(A, 1):
if i in a:
continue
return i
solution(A)
# 3
答案 2 :(得分:1)
如果使用range
函数对列表进行排序或近似排序,则可以利用列表理解:
def solution(A):
return [value for value in range(min(A),max(A)) if value not in A]
基本上,我们说的是从min
的{{1}}值到A
的{{1}}值开始的数字序列,如果有的话值不在原始max
列表中,请返回这些值。这将返回多个缺失值,例如:
A
注意:您提到的是“正”整数,不确定是否是严格的要求,但这不能说明负值。
我认为我们可以对此做出解释:
A
例如:
>>> def solution(A):
... return [value for value in range(min(A),max(A)) if value not in A]
...
A = [1, 2, 3, 4, 7, 8, 10]
>>> solution(A)
[5, 6, 9]
>>>
>>> A = [2, 4, 1, 5]
>>>
>>> solution(A)
[3]
答案 3 :(得分:0)
在循环中使用i += 1
时,只会出现一个错误。如果A
的长度为n
,并且n
中缺少A
,但是n+1
中存在A
,则该函数将返回None
。可以通过循环到len(a)+1
来解决此问题。
def solution(A):
length = len(A) + 1
i = 1
while i < length:
if i not in A:
return i
i += 1
根据您对缺失正整数的定义,可以通过一些数学运算来找到。
def solution(A):
n = len(A) + 1
list_sum = (n * (n+1)) / 2
a_sum = sum(A)
missing = list_sum - a_sum
if missing != n:
return missing
采用列表的长度,然后添加一个并将其定义为n
。使用该方程求和连续的正整数并将其保存到list_sum
中。找出A
的总和。 list_sum
和a_sum
之差将是丢失的整数,因为我们保证只能丢失一个整数。为了保持函数的行为,如果丢失的数字以n
结尾,那么我们知道没有丢失的数字,请返回None
。
答案 4 :(得分:0)
好吧,这是从列表中查找缺失元素的最佳方法。
SELECT
products.id
,products.created_at_timestamp
,products.last_update_timestamp
,product_names.name
,product_summaries.summary
,product_names.language
FROM
products
INNER JOIN
product_names ON product_names.product_id = products.id
INNER JOIN
product_summaries ON product_summaries.product_id = products.id
AND product_summaries.language = product_names.language
答案 5 :(得分:0)
使用range(start, stop),我们可以建立一个已经包含所有数字的排序列表。现在,只需在列表中查找缺失的值即可。
我们的range
将使用您列表中的较低值和较高值来制作。 range(min(A), max(A))
。
def solution(A):
missings = []
for n in range(min(A), max(A)): # Iterate over each number in the sorted and complete list.
if n not in A: # If that number isn't in your list.
missings.append(n)
return missings
或作为一行列表中的列表内容:
def solution(A): return [n for n in range(min(A), max(A)) if n not in A]
示例:
>>> solution([1, 9, 4, 3, 11, 5, 7])
[2, 6, 8, 10]
但是您说的是“找到缺失的 正 整数” ,所以您不希望出现负数
只需将 min(A)
的range(min(A), max(A))
部分更改为range(
max(0, min(A))
, max(A))
。< br />
max(0, min(A))
将使用max
为您提供介于0和较低实际值之间的较大数字,因此将负数替换为0。
示例:
>>> solution([-4, -5, 1, 9])
[0, 2, 3, 4, 5, 6, 7, 8]
但是如前所述,您只说过:“找到缺失的 阳性 整数” ,因此首先,我知道你不想要负面的东西。
但是,如果您只希望缺失(作为我的第一个想法)非负值(作为第二个想法)在较低的非负值之后< / strong>(新想法)?
容易!
只需将 min(A)
的range(min(A), max(A))
部分更改为range(
min([n for n in A if n >= 0])
, max(A))
。
min([n for n in A if n >= 0])
将在列表中寻找较低的非负值。
示例:
>>> solution([-4, -5, 3, 9])
[4, 5, 6, 7, 8]