60. 第k个排列

60. 第k个排列

60. 第k个排列
例如:
输入: n = 4 k = 10

10 = 3! * 1 + 4
4 = 2! * 2 + 0

表明 第10个排列位于
2 分支下的 (余数 > 0)
第2个分支下的 (余数 == 0)
最后一个排列
即 2 3 4 1

class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        
        # n个数顺序排列
        l = [i + 1 for i in range(n)]
        
        # 阶乘
        f = [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
        order = n - 1        
        
        result = ""
        
        while k > 0:
            
            # 商
            q = k // f[order]
            # 余数
            r = k % f[order]
            
            if r:
                
                # 余数 > 0
                result += str(l[q])
                del l[q]
            else:
                
                # 余数 == 0 表示位于 q 分支下的最后一个排列
                result += str(l[q - 1])
                del l[q - 1]
                
                for num in l[::-1]:
                    result += str(num)
                break
            
            # 更新 k
            k = r
            # 更新 阶乘
            order -= 1
        
        return result