网上看过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))