无聊刷道题.md

2022/6/13 leetcode

# 刷题

关于刷题的重要程度,我想大家都是明白的。不管大大小小的公司,都或多或少有这样的考核要求。大家也跟着饭佬了解过相应的情况,如果有一定的兴趣和基础,就别犹豫,开始慢慢刷起来。

先说明这是一个不会经常更新的系列,因为我今天纯粹是因为比较闲的星号疼。

# 今日打卡20210412

题意大家看一眼基本上就都知道了,大意是说这些数组有很多个数字,你把这些数字组成最大的数,注意,是以每个数字为单位,所以对于"205"这种数字你不能把它变为"520"。

# 想法

我一开始是没看答案的,想法也就是排序嘛,社会很单纯,复杂的是leetcode.

排序了之后来一发"".join()不是美滋滋吗?

于是我开始写排序的算法,首先想到的是a和b用zip一起遍历,于是我写了这样的代码:

错误示范

当然首先要先把数字都转为字符串,然后编写比较方法。这边想的是用zip,如果前面的数字大的话,直接return 1 也就是a > b。如果比完了,比如"35"和"35",他们在第一和第二个数字都没有分出高下,那么随便返回一个即可。

如果b的数字更长,比如"355"和"3552",那么我就用25进行对比,看起来想法没问题,提交的时候就报错了。

当我纠结犹豫的时候,我想到,我何必去人肉比较这2个数字的大小呢?对于2个数字而言,他们只有abba的组合,那么我比较abba不就好了?

于是我又写出了这样的代码:

但是这儿遇到一个特别的用例:

这可让人发愁了!其实不难,只要你排好序后,判断第一个数字是不是"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