Python程序:查找大小为k的1到n范围内第k个字典序序列
假设我们有两个值n和k。现在考虑一个从1到n的数字列表[1, 2, ..., n],并生成此列表的每个排列的字典序序列。例如,如果n = 4,我们有[1234, 1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2413, 2431, 3124, 3142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4312, 4321]。我们必须找到此排列序列的第k个值作为字符串。
因此,如果输入类似于n = 4 k = 5,则输出将为“1432”。
为了解决这个问题,我们将遵循以下步骤:
定义一个函数factors()。它将接收num作为输入。
quo := num
res := 一个双端队列,并在开头插入0。
i := 2
当quo不为空时,执行以下操作:
quo := (quo / i)的商,rem := quo mod i
在res的左侧插入rem
i := i + 1
返回res
从主方法执行以下操作:
numbers := 一个包含从1到n值的列表
res := 空字符串
k_fact := factors(k)
当k_fact的大小小于numbers的大小。
res := res连接numbers的第一个元素作为字符串,然后删除numbers的第一个元素
对于k_fact中的每个索引,执行以下操作:
number := numbers的第index个元素,然后删除该元素
res := res连接number
返回res
让我们看看以下实现,以便更好地理解:
示例
from collections import deque def factors(num): quo = num res = deque([0]) i = 2 while quo: quo, rem = divmod(quo, i) res.appendleft(rem) i += 1 return res class Solution: def solve(self, n, k): numbers = [num for num in range(1, n + 1)] res = "" k_fact = factors(k) while len(k_fact) < len(numbers): res += str(numbers.pop(0)) for index in k_fact: number = numbers.pop(index) res += str(number) return res ob = Solution() n = 4 k = 5 print(ob.solve(n, k))
输入
4, 5
输出
1432
广告