最小未使用id条件

2024-03-28 19:01:57 发布

您现在位置:Python中文网/ 问答频道 /正文

def next_id(arr):
    if arr:
        arr.sort()
        if arr[0] != 0:
            return 0
        for i in range(len(arr)):
            if (arr[i]-arr[i+1])<-1:
                return arr[i]+1
            else:
                return arr[len(arr)-1]+1
    else:
        return 0

我正在尝试查找最小的未使用ID,由于某些原因,它没有进入此if条件:

if (arr[i]-arr[i+1])<-1:

当我尝试这个的时候

next_id([0,1,2,3,5]

对于test,它返回6而不是4。你知道吗


Tags: inidforlenreturnifdefrange
3条回答

这个怎么样?你知道吗

def next_id(arr):
    arr = sorted(set(arr))
    # arr = sorted([x for x in set(arr) if type(x) is int]) # If you want a more tolerance
    if arr[0] != 0:
        return 0
    for i, v in enumerate(arr):
        if i != v:
            return i
    return i+1

它只是遍历每个位置,如果不匹配则返回索引。我添加了set(),以防重复。你知道吗

arr[0] = 0
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 5 # => UH OH! Return 4

所以:

print(next_id([0,1,2,3,5])) # => 4
print(next_id([0,1,2,3,4,5])) # => 6
print(next_id([7,1,3,7,1,4,2,3,4,7,0,9,9,2,3,7,0,9,6,5])) # => 8

问题是,函数总是for的第一个循环中存在:对于数组[0, 1, 2, 4, 5]的第一次迭代,差异是-1;并且else分支运行;这会立即返回最大的id+1。你知道吗

因此,此代码只能在循环完成后执行:

def next_id(arr):
    if not arr:
        return 0

    arr.sort()
    if arr[0] != 0:
        return 0

    for i in range(len(arr) - 1):
        if arr[i] - arr[i + 1] < -1:
            return arr[i] + 1

    return arr[-1] + 1

请注意,也需要调整结束索引—而不是迭代到len(arr),我们只能迭代到len(arr) - 1,否则arr[i + 1]将超出界限。你知道吗


如果你想写得更简洁,同样的算法也可以写成

def next_id(arr):
    return next(i for i, j in enumerate(sorted(arr) + [None]) if i != j)

for循环中,您有以下结构:

for ...:
    if ...:
        return ...
    else ...:
        return ...

这意味着for循环保证在第一次迭代时返回。请尝试这样的结构:

for ...:
    if ...:
        return ...
return ...

如果if曾经满足,则此结构将获得第一个返回;如果if从未满足,则此结构将获得第二个返回。你知道吗

相关问题 更多 >