算法题:拼接最大数
输入:一个非负整数数组,例如
[10, 2]
输出:通过拼接得到的最大数字,例如
210
。✨要求就是用数组中的所有数字拼接成一个“最大”的结果。
[3, 30, 34, 5, 9]
,如果按字面意思排序就是 [9, 5, 34, 30, 3]
,拼出来变成 9534330
,但答案是 9534330
。x
和 y
,如果拼接结果 xy
(x
拼在y
前)比 yx
(y
拼在x
前)大,那说明 x
应该排在 y
前面。用 Python 实现这逻辑可以这样写:
from functools import cmp_to_key
def largestNumber(nums):
# 自定义比较函数
def compare(x, y):
if x + y > y + x:
return -1
elif x + y < y + x:
return 1
else:
return 0
# 将数字转成字符串,因为拼接操作在字符串上
nums = list(map(str, nums))
# 按自定义规则排序
nums.sort(key=cmp_to_key(compare))
# 拼接结果
result = ''.join(nums)
# 特殊情况,如果最高位是0(比如输入全是0),直接返回0
return '0' if result[0] == '0' else result
# 示例
nums = [3, 30, 34, 5, 9]
print(largestNumber(nums)) # 输出:9534330
compare
函数。它让排序变得“定制化”,通过比较 xy
和 yx
决定顺序。然后用 Python 的 cmp_to_key
把这个逻辑嵌到排序里,最后拼接结果。O(n log n)
,对大数组性能会有些压力。30
和 3
,直接按数值排就掉坑里了。cmp_to_key
可以收拾得明明白白,但换成别的语言,可能就得写更多样板代码。对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。