全排列python

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

猜你喜欢

转载自blog.csdn.net/zuanfengxiao/article/details/80267355