问题描述
有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)) # 最后将列表中的字符都拼接起来
一步一步的大踏步向前吧!