36、数据结构与算法实战:联接最大数

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()函数也可以现根据是不是前缀进行分类,再比较字典序,应该会简洁一些。

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: