贪心算法之拼接最大数字问题

问题:对于n个非负整数,如何拼接它们使得他们得到整数结果值最大?如:32, 64, 12, 118, 11829, 10    拼接的最大整数是:6432121182911810

解决:将应当拼接的顺序排列好直接join。直接上,首字数大的排在最前,但如果首字数相同如何比较呢,如:718和71819谁要放在前面,当然是718在71819在前;又如:118和11829,此时是11829在前。是由两数字前后相加比较得到的。

lambda表达式只能接受一个参数,而我们需要接受两个参数进行处理时该怎么办呢?

functiontools中的cmp_to_key可以接受两个参数进行必要的操作,比较x和y的大小,x<y返回1

然后再利用sort排序函数,根据两两构成的字符串排序得到最终序列

代码:

def my_cmp(x, y):
    # 两两比较大小,后者比前者大,返回1
    if x+y > y+x:
        return -1
    elif x+y < y+x:
        return 1
    else:
        return 0

def number_join(li):
    """ 最大字数字拼接问题
    :param li: 待拼接数据列表
    :return:
    """
    from functools import cmp_to_key
    new_li = list(map(str, li))
    new_li.sort(key=cmp_to_key(my_cmp))
    print("".join(new_li))


if __name__ == '__main__':
    data = [32, 64, 12, 118, 11829, 10]
    number_join(data)

结果展示:

 

posted @ 2021-04-17 23:52  今夜无风  阅读(1008)  评论(0编辑  收藏  举报