备战蓝桥杯Day29 - 拼接最大数字问题

问题描述

有n个非负整数,将其按照字符串拼接的方式拼接为一个整数如何拼接可以使得得到的整数最大?

例: 32,94,128,1286,6,71可以拼接除的最大整数为 94716321286128。

问题思路

1.比较两个字符串的第一个数字,数值大的在前面,数值小的在后面

2.当两个字符串长度差不多且其中一个是另一个的字串时,从第一个数字开始比较两个字符串的方法就不太可行了。

3.更好的解决办法是:比较两个字符串结合在一起后的字符串的大小,比如:“128” + ”1286“ < "1286" + "128",通过比较字符串拼接后的数值大小,我们的算法也更容易实现。

代码实现

比较大小是调用python自带的包,也可以自己写冒泡排序来进行排序。

from functools import cmp_to_key
li = [32, 94, 128, 1286, 6, 71]


def xy_cmp(x, y):  # 定义两个字符串拼接后数值比较函数
    if x+y < y+x:
        return 1  
    elif x+y > y+x:
        return -1
    else:
        return 0


def num_join(li):  # 定义拼接函数
    li = list(map(str, li))  # 通过map函数将列表中的数字都转换成字符串格式
    li.sort(key=cmp_to_key(xy_cmp))
    return "".join(li)

print(num_join(li))

家人们咱们就是说直接用冒泡排序排好序后连接字符串就可以了,上面这个函数不常用也不太好理解,直接冒泡排序实现超级简单!

li = [94, 65, 73, 128, 1286, 4]

li = list(map(str, li))   # 将列表中的数字转为字符串类型的

for i in range(len(li) - 1):  # 一整个就是冒泡排序的思想
    for j in range(len(li) - 1 - i):
        if li[j]+li[j+1] < li[j+1]+li[j]:  # 唯一不同是不是比较两个数字的大小
                                            # 而是比较两个数链接在一起后数值的大小
            li[j], li[j+1] = li[j+1], li[j]

print("".join(li))  # 最后将列表中的字符都拼接起来

一步一步的大踏步向前吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值