LeetCode Largest Number

来源:互联网 发布:winner2016淘宝造物节 编辑:程序博客网 时间:2024/06/07 02:33

LeetCode解题之Largest Number


原题

给定一组非负整数,将这些整数拼接成最大的数字。由于返回的数字可能非常大,直接返回字符串。

注意点:

例子:

输入: nums = [3, 30, 34, 5, 9]

输出: ‘9534330’

解题思路

要将这些数字拼接起来,其实就是要规定好这些数字出现的先后顺序,所以我们要对这些数字进行排序。直接比较数字的大小是行不通的,如12和121,虽然121>12,但是12121>12112。应有的排序规则应该是如果AB>BA,那么我们规定A>B,也就是最后拼接时A放在B之前。这个方案看着有点道理,而且也是正确的,但要证明按照这种排序得到的数字是最大的比较困难。

以下证明参考自@19thhell。主要要说名两点,一是这种比较关系具有传递性,第二是按照这样的拼接顺序得到的数是最大的。

首先,通过证明传递性可以帮我得到所有数的大小关系:

    为了方便表示,定义f(X) = 10^(lgX + 1), (lgX + 1)表示X有多少位,所以AB = f(B)A + B    假设 A <· B, B <· C (<·是为了与一般的小于号区分)    即 AB < BA, BC < CB    因为 AB < BA    f(B)A + B < f(A)B + A    (f(B) - 1)A < (f(A) - 1)B    A < B·(f(A) - 1) / (f(B) - 1)   (1)    因为 BC < CB    f(C)B + C < f(B)C + B    (f(C) - 1)B < (f(B) - 1)C    B < C·(f(B) - 1) / (f(C) - 1)   (2)    结合 (1), (2),    A < C·(f(A) - 1) / (f(C) - 1)    (f(C) - 1)A < (f(A) - 1)C    f(C)A + C < f(A)C + A    AC < CA    即得到了A <· C    根据传递性可以得到按照上面的比较规则排序后的数字满足A1 ·> A2·> ... ·> A(n-1)

下面证明A1A2…A(n-1)是这些数能够拼接成的最大的数字。

如果A < B,那么我们容易得到CAD < CBD(这里是一般的大小关系) (3)因为 A1 ·> A2·> ... ·> A(n-1)所以 A1Aj > AjA1, 再根据(3)有以下的大小关系(A1B)C...N > (BA1)C...NB(A1C)...N > B(CA1)...N -> A1BC...N > BCA1...N...... -> A1BC...N > BCA...NA1也就是说A1放在第一个位置相对于把它放在其他的位置时,拼接出来的数字大。同理我们也可以推断出A2应该放在第二位......

综上所述,我们通过将数字按照上述方法排序后再拼接就可以得到最大的数字。还有需要注意的是可能参数是多个0,此时字符串拼接的结果是一串0,不符合常规的表达方法,要将其改为0。

AC源码

from functools import cmp_to_keyclass Solution:    # @param {integer[]} nums    # @return {string}    def largestNumber(self, nums):        sorted_nums = sorted(map(str, nums), key=cmp_to_key(lambda x, y: int(y + x) - int(x + y)))        result = ''.join(sorted_nums).lstrip('0')        return result or '0'if __name__ == "__main__":    assert Solution().largestNumber([3, 30, 34, 5, 9]) == '9534330'    assert Solution().largestNumber([0, 0]) == '0'

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米电视碎屏了怎么办 oppo手机第二屏幕打不开怎么办 红米note3屏幕裂了怎么办 小米3屏幕烂了怎么办 苹果x屏幕触屏不灵怎么办 票买好了身份证丢了怎么办 广发信用卡身份证到期了怎么办 人在外地身份证丢了怎么办 人在国外身份证丢了怎么办 身份证丢了户口本不在怎么办 在北京身份证过期了怎么办 没社保卡怎么办厦门健康卡 扬州市民卡丢了怎么办 扬州市民卡坏了怎么办 重庆社保卡坏了怎么办 社保卡丢了看病怎么办 社保卡丢了买药怎么办 常州社保卡丢了怎么办 深圳社保卡掉了怎么办 上海医保卡丢了怎么办 户口转到西安后医保怎么办 上海医保卡掉了怎么办 上海医保本丢了怎么办? 新版医保卡丢了怎么办 武汉社保卡掉了怎么办 职工社保卡丢了怎么办 杭州社保卡丢了怎么办 农村医疗卡丢了怎么办 陕西省医保卡丢了怎么办 小孩社保卡掉了怎么办 社区医保本丢了怎么办 宝宝医保卡掉了怎么办 同煤医疗卡丢了怎么办 杭州医保卡丢了怎么办 新的医保卡丢了怎么办 二代医保卡丢了怎么办 老医保卡丢了怎么办 上海医保卡余额用完了怎么办 身份证丢了医疗报销怎么办 取公积金身份证丢了怎么办 身份证丢了怎么办就诊卡