我不知道第二个“ return”如何工作-return len(A)+ 1

时间:2019-12-04 00:17:30

标签: python-3.x

这是来自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的工作原理

在此先感谢您的回答。

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()