[LeetCode每日一题]179.最大数

179.最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

 

示例 1:

输入:nums = [10,2]
输出:"210"


示例 2:

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


示例 3:

输入:nums = [1]
输出:"1"


示例 4:

输入:nums = [10]
输出:"10"

 

1.解题思路


类比排序算法,首先将这组数变成一组字符串,然后字符串排序,即str_nums = list(map(str, nums))。

假设x, y是str_nums中的两个字符串,那么关键就是要判断x和y的相对位置,举个栗子,假设x = '30', y = '34',则x+y='3034',y+x='3430',显然3430>3034,因此y的位置就在x的前边。

利用python中类list的内置函数sort或sorted(sorted会返回新的对象,而sort会改变输入本身)就可以对str_nums进行排序。

代码如下。

import functools

class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        str_nums = list(map(str, nums))

        str_nums.sort(key=functools.cmp_to_key(lambda x, y:-1 if x+y>y+x else 1))

        if str_nums[0] == '0':return '0'

        return ''.join(str_nums)

2.相关函数解释

map(func, iterable, ...)  在python3.x中会返回一个迭代器,而在python2.x中会返回一个list。

functools.cmp_to_key(func)  将老式的比较函数(comparison function)转化为关键字函数(key function)。与接受key function的工具一同使用(如 sorted(), min(), max(), heapq.nlargest(), itertools.groupby())。该函数主要用来将程序转成 Python 3 格式的,因为 Python 3 中不支持比较函数。比较函数是可调用的,接受两个参数,比较这两个参数并根据他们的大小关系返回负值、零或正值中的某一个。关键字函数也是可调用的,接受一个参数,同时返回一个可以用作排序关键字的值。

str.join(iterable)  举个栗子吧。

str='-'
l=['2016','5','9']
str.join(l)
>>>'2016-5-9'

 

posted @ 2021-04-12 21:09  noob_stu  阅读(98)  评论(0)    收藏  举报