# 刷题
关于刷题的重要程度,我想大家都是明白的。不管大大小小的公司,都或多或少有这样的考核要求。大家也跟着饭佬了解过相应的情况,如果有一定的兴趣和基础,就别犹豫,开始慢慢刷起来。
先说明这是一个不会经常更新的系列,因为我今天纯粹是因为比较闲的星号疼。
# 今日打卡20210412
题意大家看一眼基本上就都知道了,大意是说这些数组有很多个数字,你把这些数字组成最大的数,注意,是以每个数字为单位,所以对于"205"这种数字你不能把它变为"520"。
# 想法
我一开始是没看答案的,想法也就是排序嘛,社会很单纯,复杂的是leetcode.
排序了之后来一发"".join()
不是美滋滋吗?
于是我开始写排序的算法,首先想到的是a和b用zip一起遍历,于是我写了这样的代码:
错误示范
当然首先要先把数字都转为字符串,然后编写比较方法。这边想的是用zip,如果前面的数字大的话,直接return 1 也就是a > b。如果比完了,比如"35"和"35",他们在第一和第二个数字都没有分出高下,那么随便返回一个即可。
如果b的数字更长,比如"355"和"3552",那么我就用2
和5
进行对比,看起来想法没问题,提交的时候就报错了。
当我纠结犹豫的时候,我想到,我何必去人肉比较这2个数字的大小呢?对于2个数字而言,他们只有ab和ba的组合,那么我比较ab和ba不就好了?
于是我又写出了这样的代码:
但是这儿遇到一个特别的用例:
这可让人发愁了!其实不难,只要你排好序后,判断第一个数字是不是"0",如果是的话直接return "0"就可以了,就可以绕过这样的用例了。
# 最后的代码
当然这边我因为是小->大的顺序排列,所以我用了[::-1],还是有优化空间的。
最后,做完以后去官方看有没有更优解,发现官方就是这个解法,好了不说了,我要去通宵自律了!
class Solution:
def largestNumber(self, nums: List[int]) -> str:
compare = lambda x, y: int(y+x) - int(x+y)
nums = sorted([str(x) for x in nums], key=cmp_to_key(compare))
return "0" if len(nums) > 0 and nums[0] == "0" else "".join(nums)
1
2
3
4
5
2
3
4
5