Description
设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
Input
每个测试文件只包含一组测试数据,每组输入数据的第一行输入一个正整数n(n≤20)。 接下来一行输入n个正整数。
Output
对于每组输入数据,输出n个正整数联接成的最大的多位整数。
Sample Input
313 312 343
Sample Output
34331213
参考程序(Python实现)
def SortList(ls):
res=[]
for i in range(len(ls)):
m_ind=i#默认当前最“大”元素下标为i
m=ls[m_ind]#默认当前最“大”元素为ls[m_ind]
for j in range(i+1,len(ls)):
if m<ls[j]:#在字典序下m<ls[j]
if m != ls[j][:len(ls[i])]:#m不是ls[j]的前缀
m=ls[j]
m_ind=j
else:
#m是ls[j]的前缀,那么前len(m)个字符都是一致的,只需比较ls[j]去掉前len(m)个字符
#剩下后面几个字符拼接上m 和ls[j]即可
if ls[j][len(m):]+m > ls[j]:
m=ls[j]
m_ind=j
else:
pass
elif m>ls[j]:
if ls[j] == m[:len(ls[j])]:
#ls[j]是m的前缀,如m='321',ls[j]='3',应该是ls[j]排在前面
if m[len(ls[j]):]+ls[j] < m:
m=ls[j]
m_ind=j
ls[m_ind],ls[i]=ls[i],ls[m_ind]
res.append(m)
return res
while True:
try:
n=int(input())
ls=list(input().split())
new=SortList(ls[:])
res=""
for num in new:
res+=num
print(res)
except:
break
分析:
本题很容易想到的思路是将所有输入数据,当做字符串按照字典序进行排序,然后逆置输出,但这样考虑是不全面的,例如,‘321’和‘32’,按字典序比较,‘321’>‘32’,但这样拼接以后得到的‘32132’却比‘32321’小,所以需要对这类情况单独讨论。
本题输入的数据个数不超过20,所以排序算法并不是很关键。参考程序中使用的是“选择排序”。SortList()函数也可以现根据是不是前缀进行分类,再比较字典序,应该会简洁一些。
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: