60. 排列序列
难度:困难
问题描述:
给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 k 个排列。
示例 1:
输入:n = 3, k = 3
输出:"213"
示例 2:
输入:n = 4, k = 9
输出:"2314"
示例 3:
输入:n = 3, k = 1
输出:"123"
处理步骤:
- 利用递归生成n个数的全排列
- 将生成的全排列按大小顺序排序
- 输出排列中第k个元素
算法简单,全排列的生成又一次成为解决问题的关键
程序如下:
#输入n和k
n=int(input('pls input n='))
k=int(input('pls input k='))
words=[str(i) for i in range(1,n+1)]
#qpl()函数生成数字全排列
def qpl(words):
if len(words)==1:
return words
elif len(words)==2:
return [words[0]+words[1],words[1]+words[0]]
else:
a=[]
w=qpl(words[1:])
for j in w:
for i in range(0,len(j)+1,len(words[0])):
a.append(j[:i]+words[0]+j[i:])
return a
c=qpl(words)
c.sort()
print(f'n为{n}的全排列如下:',end=' ')
l=len(c)
for i in range(l):
if i%5==0:
print()
print(c[i],end=' ')
else:
print(c[i],end=' ')
print()
print(f'其中第{k}个排列为{c[k-1]}')
运行实例1:
pls input n=3
pls input k=3
n为3的全排列如下:
123 132 213 231 312
321
其中第3个排列为213
运行实例2:
pls input n=4
pls input k=5
n为4的全排列如下:
1234 1243 1324 1342 1423
1432 2134 2143 2314 2341
2413 2431 3124 3142 3214
3241 3412 3421 4123 4132
4213 4231 4312 4321
其中第5个排列为1423
运行实例3:
pls input n=5
pls input k=3
n为5的全排列如下:
12345 12354 12435 12453 12534
12543 13245 13254 13425 13452
13524 13542 14235 14253 14325
14352 14523 14532 15234 15243
15324 15342 15423 15432 21345
21354 21435 21453 21534 21543
23145 23154 23415 23451 23514
23541 24135 24153 24315 24351
24513 24531 25134 25143 25314
25341 25413 25431 31245 31254
31425 31452 31524 31542 32145
32154 32415 32451 32514 32541
34125 34152 34215 34251 34512
34521 35124 35142 35214 35241
35412 35421 41235 41253 41325
41352 41523 41532 42135 42153
42315 42351 42513 42531 43125
43152 43215 43251 43512 43521
45123 45132 45213 45231 45312
45321 51234 51243 51324 51342
51423 51432 52134 52143 52314
52341 52413 52431 53124 53142
53214 53241 53412 53421 54123
54132 54213 54231 54312 54321
其中第3个排列为12435
感悟:战胜困难,前面必定一马平川!