Problem Description:
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9]
, the largest formed number is 9534330
.
Note: The result may be very large, so you need to return a string instead of an integer.
太久没有做题,拿到问题后就写代码,总是漏洞百出。刚看到这个题目时我的想法是,自己定义一个满足题目要求的比较函数,然后对整个数组进行排序即可。这个思路大体上是对的,但是仍有很多细节需要注意。
首先,我曾单纯地以为一个直接按照string的方式比较这些数字就可以满足题目的要求,但是发现不对劲的是,按照题目意思“9”和“98”相比应该“9”更大。于是我就把两个数字先转换成组成它们每位数字的数组,然后自己写了一个满足上述那种情况的比较函数。
然而,事情似乎并没有这么简单,另外一个例子完全证明了上面的比较方法是错误的,那就是“21”和“212”。如果按照长度短的更大的规则,即“9”比“98”大的话,那“21”就比“212”大,这两个数字得到的largest number就是“21212”,可是很明显“21221”会更大。
看完这个例子,我就豁然开朗了,上面的比较方法完全是错误的,我们可以把两个字符串拼接起来进行比较。即num1表示成字符串“a1a2...ai”,num2表示成字符串“b1b2...bj”,我们把num1和num2的比较定义为“a1a2...aib1b2...bj”和“b1b2...bja1a2...ai”的比较即可。
最后,还有一个特例需要处理。因为题目要求最后返回的是一个number,所以“00”是不符合要求的。我又愚蠢地去遍历最后返回的结果,把前面多余的0全部去掉。后来才发现,只要第一个数字是0的话,直接返回“0”好了,因为0的后面不可能有更大的数字了,我在愚蠢的遍历时还以为会出现“00123”呢!(⊙﹏⊙)b