边工作边刷题:70天一遍leetcode: day 93

Permutation Sequence

原理:一个permutation是n位,在第i位的值取决于有多少个i-1位的组合。这i-1位的组合是在高位pick完之后剩下的数中
细节:

  • 低位的个数和哪个数已经pick了是无关的,只有选择具体数时候才有关
  • 不同于decimal,位数是固定的,所以不能用k>0作为循环条件(这样只会选择某几位),而是用for循环。
  • 当i=0的时候,要选取最后一个位,但factorial不能再除i或者0了,所以这里要加corner的判断
class Solution(object):
    def getPermutation(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: str
        """
        fact = 1
        for i in range(2, n):
            fact*=i

        nums = range(1,n+1)

        k-=1
        res = []
        for i in range(n-1, -1, -1):
            p = k/fact
            k = k-k/fact*fact
            res.append(str(nums[p]))
            del nums[p]
            if i!=0: fact/=i
        #res.append(str(nums[0]))
        return ''.join(res)
            
posted @ 2016-04-09 06:18  absolute100  阅读(80)  评论(0编辑  收藏  举报