问题:
设有n个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n=4时,4个整数21,8,901,6连成的最大整数为9018621。
求解思路:
对本题求解可以用贪心算法,得到最优解。首先想到的是对n个整数按大小进行排序,如果只考虑首位会出现结果错误的情况,需要对此时的贪心策略进行改进,所以用到了自定义比较大小的方法。这里用的是按照连接字符串的方式将数字两两组合,比较大小并进行排序。例如两个数字3、31,组合会有两种情况:331>313,为求最大整数,我们选择后者。
调用模块:
这里我们用到的是自定义排序规则,即functools.cmp_to_key(),按照思路中的排序规则进行编程求解,对自定义的cmp函数进行包装,赋值给sorted函数中的关键字参数key,实现想要的排序效果。当cmp_to_key返回值小于0时进行两个参数的交换,大于或等于0时参数顺序不变。
完整代码:
# hr
# 时间:2023/9/20 17:25
from functools import cmp_to_key
def IsBig(a, b): # 判断自定义规则下数字的大小
if a + b < b + a:
return 1 # 相反
elif a + b > b + a:
return -1 # 保持
else:
return 0 # 保持
def join(ls):
ls = sorted(ls, key=cmp_to_key(IsBig))
print("".join(ls))
if __name__ == "__main__":
print('请输入n的值:')
n = int(input())
print('请输入%d个元素:' % n)
ls = list(input().split())
print('连成的最大整数为:')
join(ls)