问题描述
例如,假设我们有 NextInorder(10,(1,2,4,7))
,然后将这两个作为函数的输入,我希望编写一个 python 函数,通过查找字典顺序中的下一个排列来返回 (1,8)
排列在 1-10
再举个例子,NextInorder(10,(5,3,10))
会返回 (5,1)
解决方法
您可以从最后一个位置开始使用数字计数器方法。将最后一个位置增加到一个不在先前位置中的值。当下一个值超出范围时,回溯到前一个位置。
例如:
def nextPerm(N,P):
result = list(P) # mutable permutation
i = len(P)-1 # position to advance (start with last)
while i in range(len(P)): # advance/backtrack loop
result[i] += 1 # next value at position
if result[i] > N: # value beyond range
result[i]=0
i -= 1 # backtrack
elif result[i] not in result[:i]: # distinct values only
i += 1 # next position to advance
return None if i<0 else tuple(result)
输出:
P = (1,2,4,7)
while P:
P = nextPerm(10,P)
print(P)
(1,8)
(1,9)
(1,10)
(1,5,3)
(1,4)
(1,6)
(1,7)
(1,6,3)
...
,
您可以使用 itertools
:
from itertools import permutations
def NextInOrder(n,current):
perms = permutations(range(1,n+1),len(current))
for perm in perms:
if perm == current:
return next(perms)
演示:
>>> NextInOrder(10,(1,7))
(1,8)
>>> NextInOrder(10,(5,3,10))
(5,1)