https://leetcode.com/problems/permutation-sequence/
这类题目,有必要学习一下,排列,问第K个。

个人解答

  1. class Solution:
  2. def getPermutation(self, n: int, k: int) -> str:
  3. l = [i for i in range(1, n + 1)]
  4. res = ''
  5. fac = factorial(n)
  6. k -= 1
  7. while k > 0:
  8. q, k = divmod(k, fac // n)
  9. res += str(l[q])
  10. del(l[q])
  11. fac //= n
  12. n -= 1
  13. res += ''.join(map(str, l))
  14. return res

题目分析

显然是有规律可言的。

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

从最高位到最低位,选择越来越少(分别是3,2,1)
定了最高位之后,后边有 (n-1)!
具体来看,如果想知道当前对应的是第几个,那么除以(n-1)!即可,而剩下的,可以用来索引下一位。
代码中的 fac // n 其实就是 (n - 1)! ,只不过这样计算更为高效。