这是来自Github的编码课程。
我想知道第二个回报return len(A) + 1
的工作原理。
列表A的形式为1到N + 1 ,其中缺少1个数字
N是数字0-100000
列表A中的数字不同
解决方法是找到丢失的号码。
def solution(A):
index_dict = {index+1: value for index, value in enumerate(A)}
value_dict = {value: index+1 for index, value in enumerate(A)}
for k in index_dict:
if k not in value_dict:
return k
return len(A) + 1
我想通了直到return k
。想知道return len(A) + 1
的工作原理
在此先感谢您的回答。
答案 0 :(得分:1)
最后一行return len(A) + 1
是可以从index_dict
找到value_dict
的所有值的情况下返回的值。因此,它将不得不返回到N + 1
的值,因为它必须是列表中缺少的那个值。
通过使用set
而不是dict
s,实际上甚至可以简化解决方案并提高效率:
def solution(A):
index_set = {index + 1 for index, _ in enumerate(A)}
value_set = {value for value in A}
for k in index_set:
if k not in value_set:
return k
return len(A) + 1
然后我们还注意到,我们可以删除设置的内容并仅调用set(A)
,并且可以将index_set
替换为range
对象:
def solution(A):
set_A = set(A) # store this, so it doesn't have to be recomputed on every loop
for k in range(1, len(A) + 1):
if k not in set_A:
return k
return len(A) + 1
我们也可以将范围增加1并完全删除最后一个return
。该解决方案实际上比原始解决方案效率更高,并且在我的计算机上的速度要快7倍左右:
def solution(A):
set_A = set(A)
for k in range(1, len(A) + 2):
if k not in set_A:
return k
效率不会更高,只是为了好玩,我们可以在set
中制作一个range
,并返回从difference
中剩下的单个元素和set(A)
:
def solution(A):
return set(range(1, len(A) + 2)).difference(set(A)).pop()