jan-walter-luigi-mZh44BZpfvk-unsplash.jpg

题目描述

给定参数n,从1到n会有n个整数:1,2,3,…,n, 这n个数字共有n!种排列. 按大小顺序升序列出所有排列的情况,并一一标记,
当n=3时,所有排列如下: “123” “132” “213” “231” “312” “321”
给定n和k,返回第k个排列.

输入描述: 输入两行,第一行为n,第二行为k, 给定n的范围是[1,9],给定k的范围是[1,n!]。

输出描述: 输出排在第k位置的数字。
实例1: 输入: 3 3 输出: 213 说明 3的排列有123,132,213…,那么第三位置就是213
实例2: 输入 2 2 输出: 21 说明 2的排列有12,21,那么第二位置的为21

代码

  1. let n = 3
  2. let k = 3
  3. const str = []
  4. const factorials = [1]
  5. const candidates = []
  6. let fact = 1
  7. for (let i = 1; i <= n; i++) {
  8. candidates.push(i)
  9. fact *= i
  10. factorials.push(fact)
  11. }
  12. k -= 1
  13. for (let i = n - 1; i >= 0; i--) {
  14. const index = parseInt(k / factorials[i])
  15. str.push(candidates.splice(index, 1))
  16. k -= index * factorials[i]
  17. }
  18. console.log(str.join(''))