贪心算法求解n个整数连接成最大整数(python)

问题:

设有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)

a67e7c09e4ce4188b0fde2ab2263632c.webp

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Issme

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值