网上看过c讲的全排后用python实现下,并在校招题上做了下应用
递归思想
# -*- coding:utf-8 -*-
#@author:xinxinzhang
#法一:调用:
import itertools
print(list(itertools.permutations('0123',4)))
#法2:自己撸:
'''思想就是:将每个数与第p个做交换 把后面的做全排列,直到p==q'''
def printArr(arr,n): #打印p,q之间的数
for i in range(n):
print(arr[i],end=' ')
print('\n')
def perm(arr,p,q):
if p==q:
printArr(arr,q+1)
else:
for i in range(p,q+1):
arr[i],arr[p]=arr[p],arr[i]#与第p个数做交换
perm(arr,p+1,q)
arr[i],arr[p]=arr[p],arr[i]#再把位置交换回来
if __name__=='__main__':
arr=[1,2,3]
perm(arr,0,len(arr)-1) #因为要取出去一位 所以q=列表长-1
下面用全排完成一道校招:
# -*- coding:utf-8 -*-
#@author:xinxinzhang
'''设有n个正整数,将他们连接成一排,组成一个最大的多位整数。
如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。'''
c=''
def perm(arr,p,q):
if p==q:
global c
for i in range(n):
c += arr[i]
c+=' '
else:
for i in range(p,q):
arr[i],arr[p]=arr[p],arr[i]
perm(arr,p+1,q)
arr[i],arr[p]=arr[p],arr[i]
return c
if __name__=='__main__':
n = int(input(''))
arr = input('').split()
result=perm(arr,0,len(arr)).split()
print(int(max(result)))
显然上述算法的缺点在于耗费大量空间保存全排结果
改进算法:
# -*- coding:utf-8 -*-
#@author:xinxinzhang
'''设有n个正整数,将他们连接成一排,组成一个最大的多位整数。
如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。
思路:把大的付给一个列表,同时从原有列表中去掉,直到列表为空
'''
max_s=''
def perm(arr):
global max_s
if len(arr)==0:
return
a=arr[0]
for b in arr:
if a+b<b+a:
a=b
max_s+=a
arr.remove(a)
perm(arr)
return max_s
if __name__=='__main__':
n = int(input(''))
arr = input('').split()
print(perm(arr))