zoukankan      html  css  js  c++  java
  • 贪心算法之拼接最大数字问题

    问题:对于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)

    结果展示:

    时刻记着自己要成为什么样的人!
  • 相关阅读:
    poj3068
    tyvj1864 [Poetize I]守卫者的挑战
    BZOJ1597 [Usaco2008 Mar]土地购买
    [AtCoder Regular Contest 083] Bichrome Tree
    [LUOGU]3919 【模板】可持久化数组
    [LUOGU]P3701 主席树(假的)
    2018.7.20模拟赛
    [CodeForces]1006F Xor Path
    2018.7.19模拟赛
    [LUOGU]P1373 小a和uim之大逃离
  • 原文地址:https://www.cnblogs.com/demo-deng/p/14672566.html
Copyright © 2011-2022 走看看