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]
对于测试,它返回6而不是4。
答案 0 :(得分:3)
问题是你的函数总是在for
的第一个循环中退出:对于数组-1
的第一次迭代,差异为[0, 1, 2, 4, 5]
;并运行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)
答案 1 :(得分:2)
这是怎么回事?
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
答案 2 :(得分:0)
在for
循环中,您拥有以下结构:
for ...:
if ...:
return ...
else ...:
return ...
这意味着for
循环保证在第一次迭代时返回。尝试这样的结构:
for ...:
if ...:
return ...
return ...
如果满足if
,则此结构将首先返回,如果永远不满足if
,则将进行第二次返回。
答案 3 :(得分:0)
试试这个:
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
return arr[len(arr)-1]+1
else:
return 0
打印(NEXT_ID([0,1,2,3,5]))
答案 4 :(得分:0)
有趣,我只是在 codewars 上做简单的 kata,在寻找如何解决问题的同时,我发现了这篇文章。我设法解决了它,这就是我使用的代码:
def next_id(arr):
for i in range(len(arr)+1):
if i not in arr:
return I
希望有所帮助。 range(len(arr)+1) required as If you would have a list [1,2,3] 下一个可用的是 [4](不在列表中),因此您需要使列表更长一些,以防万一。