我的问题是:给定一个长度为n的列表L和一个整数i,其中0 <= i < n!,如何编写一个函数perm(L, n),以O(n)时间生成L的第i个排列?我的意思是L的第i个排列是指在某个实现定义的顺序中的第i个排列,它必须具有以下属性:
1.对于任何i和任何2个列表A和B,perm(A,i)和perm(B,i)必须将A和B的第j个元素都映射到A和B的同一位置的元素。
2.对于任何输入(A,i),(A,j)perm(A,i)== perm(A,j)当且仅当i == j。
注意:这不是作业。事实上,我两年前就解决了这个问题,但我完全忘记了如何解决它,这让我很痛苦。下面是我尝试解决该问题失败的代码片段:
1.对于任何i和任何2个列表A和B,perm(A,i)和perm(B,i)必须将A和B的第j个元素都映射到A和B的同一位置的元素。
2.对于任何输入(A,i),(A,j)perm(A,i)== perm(A,j)当且仅当i == j。
注意:这不是作业。事实上,我两年前就解决了这个问题,但我完全忘记了如何解决它,这让我很痛苦。下面是我尝试解决该问题失败的代码片段:
def perm(s, i):
n = len(s)
perm = [0]*n
itCount = 0
for elem in s:
perm[i%n + itCount] = elem
i = i / n
n -= 1
itCount+=1
return perm
同时需要注意的是:O(n) 的要求非常重要。否则,你只能生成包含 n! 个元素的所有排列的列表,并返回其第 i 个元素。