程序从k到1到n的k个字典中查找第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、3421、3412、3421、4123、4132, 4213、4231、4312、4321]。我们必须找到此排列序列的第k个值作为字符串。

因此,如果输入类似于n = 4 k = 5,则输出将为“ 1432”

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个功能factors()。这将需要num

  • quo:= num

  • res:=双头队列,并在开头插入0

  • 我:= 2

  • 虽然现状不为空,但是

    • quo:=(quo / i)的商,rem:= quo mod i

    • 在res的左边插入rem

    • 我:=我+ 1

  • 返回资源

  • 从主要方法中执行以下操作-

  • 数字:=值从1到n的列表

  • res:=空字符串

  • k_fact:= factors(k)

  • 而k_fact的大小<数字的大小,

    • res:= res将数字的第一个元素连接为字符串,然后删除数字的第一个元素

  • 对于k_fact中的每个索引,执行

    • number:=第index个数字元素,然后删除该元素

    • res:= 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

以上是 程序从k到1到n的k个字典中查找第k个字典顺序 的全部内容, 来源链接: utcz.com/z/330759.html

回到顶部