蓝桥杯精选赛题系列——暴力拼数

题目描述

设有 n个正整数 a1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入描述

第一行有一个整数,表示数字个数 n。

第二行有 n个整数,表示给出的 n个整数 ai 。

其中, 1 <= n <= 20,1<= ai <= 10^9。

输出描述

输出一个正整数,表示最大的整数

输入输出样例

示例 1

输入

3
13 312 343

输出

34331213

示例 2

输入

4
7 13 4 246

输出

7424613

解答方法及其详细解释

from itertools import *
n =int( input())  
list2 = []    //创建一个空列表
list1 = list(  map(str, input().split() )   ) 
for s in permutations(list1):
    a = ' '.join(s)
    list2.append(a)
print(max(list2))

这段代码逻辑并不复杂,主要是通过这段代码,来介绍几个重要的函数:

1.permutations()

使用:itertools.permutations(iterable, r = None)
功能:连续返回由 iterable序列中的元素生成的长度为r的排列(如果 r 未指定或为 None,r默认设置为 iterable的长度,即生成包含所有元素的全排列。
注意:如果有相同的元素,不同位置的元素被认为不同。

来个栗子吧,如果我要从三个元素 {a,b,c} 中求出长度为 2 的所有排列,我们可以用以下两种做法:

第一种做法:

from itertools import *
s = ['a','b','c']
for element in permutations(s, 2):
    a = element[0] + element[1] 
    print(a)

第二种做法:

from itertools import *
s = ['a','b','c']
for element in permutations(s,2):
    a=''.join(element)    #把所有元素拼起来 
    print(a)

两种方法的运行结果都是:

ab
ac
ba
bc
ca
cb

如果把第 3行的 permutations(s,2) 改为 permutations(s),就是对所有元素做全排列。
除此之外 permutations() 有个缺陷:它不能按顺序输出下一个更大的排列。看下面的栗子:

from itertools import *
s = ['1','3','2']
for element in permutations(s):
    a=''.join(element)    #把所有元素拼起来 
    print(a)

输出结果为:

132
123
312
321
213
231

可见,虽然它输出了所有的排列,但不是按从小到大的顺序输出的。这使得 permutations() 在某些需要按顺序输出的场景中受到了限制。不过,如果从最小的排列开始,permutations() 还是能按顺序从小到大输出的。所以可以先排序得到最小排列,然后再使用 permutations()。
2.map()
map()函数接收一个函数为参数和一个或多个可迭代对象为参数,返回一个迭代器。此迭代器中的每个元素都是函数参数依次作用于可迭代对象后的结果。

map(function,iterable,……)

function:函数
iterable :一个或多个可迭代对象
返回值:返回迭代器。

举个栗子
生成0-9的数字列表,然后通过map()函数对该列表每一个元素的平方计算,代码如下:

list1 = []
for i in range(10):
	list1.append(i)
def square(x):
	return x**2
list2 = map(square,list1)
print(list(list2))

猜你喜欢

转载自blog.csdn.net/m0_51951121/article/details/122614946