剑指 Offer 45. 把数组排成最小的数
题目要求:输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例:输入: [3,30,34,5,9]
输出: “3033459”
题解的一般排序方法: 使用自定义排序
- 若拼接字符串 x + y > y + x,则 x “大于” y ;
- 反之,若 x + y < y + x ,则 x “小于” y .
这里提出另外一种排序的方法:
- 对于两个字符串,如果长度相等,(如34和52)从头开始每一位进行比较,则很容易得到34要排在52之前;
- 对于长度不相等的字符串,则需要将长度小的字符串进行重复,并且从头开始比较(如883和88重复为883和8888),则可以得到88要排在883之前;
- 对于重复后比较不了的,就继续重复,重复至可以比较为止(使用递归)
接下来放代码:
class Solution:
def minNumber(self, nums: List[int]) -> str:
def sort_rule(x, y):
if len(x) == len(y):
if x > y: return 1
elif x < y: return -1
else: return 0
else:
if len(x) <= len(y):
while len(x) < len(y):
x += x
else:
while len(x) > len(y):
y += y
for i in range(min(len(x),len(y))):
if x[i] > y[i]: return 1
elif x[i] < y[i]: return -1
else: continue
return sort_rule(x,y)
strs = [str(num) for num in nums]
strs.sort(key = cmp_to_key(sort_rule))
return ''.join(strs)
不是最快的解法,提供一个与题解不一样的思路。