贪心算法之拼接最大数字问题
问题:对于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)
结果展示:
时刻记着自己要成为什么样的人!