1到n 的n个数,有n!种排列(n最大为9),将这些排列从小到大的顺序进行排列 ,输出第k个排列。
例如:
输入3,2
3!共有6种排列,从小到大的排列为:
123
132
213
231
312
321
输出 132
思路:
1到n,记为list_n,排列的首位为1的话,那么有(n-1)!种排列,通过a=k/(n-1)!可以得到首位的数字list_n[a],将list_n[a]从list_n中移除,再将余数b=k%(n-1)!进行下一次阶乘(n-2)!相除,直到能整除;注意如果能整除的话首位的数字应该是list[a-1],然后把剩余的数倒叙即可
import math
# 定位k
def findNumByOrder(n, k):
list_result = []
list_n = [i for i in range(1, n + 1)]
for i in range(n - 1, 0, -1):
# print('阶乘:{0}'.format(i))
factorial_num = math.factorial(i)
a = int(k / factorial_num)
b = k % factorial_num
# print(list_n)
if b == 0:
temp = list_n[a - 1]
list_result.append(temp)
list_n.remove(temp)
list_n.reverse()
list_result = list_result + list_n
print(''.join([str(x) for x in list_result]))
return
temp = list_n[a]
list_result.append(temp)
list_n.remove(temp)
k = b
findNumByOrder(9, 362880)