经典题目,值得单独列出来,179最大数

排序问题:

list.sort() 只能针对list数据结构进行排序,但可以把其他能迭代的结构转成list进行排序

sorted() 可对任意可迭代数据结构排序

 num = sorted(num, key=functools.cmp_to_key(compare), reverse=True)
    nums.sort(key=functools.cmp_to_key(compare), reverse=True)

 key 只接受一个入参,如果需要两个入参,则调用functools.cmp_to_key()函数

将字典以value排序,用列表

nums.sort(key=lambda x:x[1], reverse=True)
num = sorted(num, key=lambda x:x[1], reverse=True)

复习一下遍历字典:

for key, item in student.items():

 注意!!不能 for key, item in student:

 

我们分析一下规律:

当 nums = [10,2] 时,结果是 210。其实我们就是在比较 [10,2] 这两个数字能组合成的 210 和 102 哪个数字更大,显然 210 更大,所以需要把 2 放在前面。
为了避免用 int 型或者 long 型越界,所以我们需要把数字先转成字符串。然后可以把待比较的两个数字 x,y 组合成两个新的数字 string(x) + string(y) 和 string(y) + string(x) ,比较一下哪种组合构成的数字更大。

答案是肯定的:首先拼接成的两个字符串一定是等长的。等长的字符串在比较的时候,是按照字符串的各个字符从前向后逐个比较的,所以相当于先比较了百分位,然后比较十分位,最后比较个位。所以在字符串等长的情况下,字符串大,那么对应的整型也更大。但两个不等长的字符串就没有这个结论了, 比如 "2" > "10",但是 2 < 10。

综上,我们按照下面的步骤:

先把 nums 中的所有数字转字符串,形成字符串数组 nums_str;
比较两个字符串 x,y 拼接的结果 x + y 和 y + x 哪个更大,从而确定 x 和 y 谁排在前面;将 nums_str 降序排序;
把整个数组排序的结果拼接成一个字符串,并返回。

作者:fuxuemingzhu
链接:https://leetcode-cn.com/problems/largest-number/solution/fu-xue-ming-zhu-zhuan-cheng-zi-fu-chuan-mm2s6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

注意1:python里的map函数,直接映射:

>>> def square(x) :            # 计算平方数
...     return x ** 2
...
>>> map(square, [1,2,3,4,5])   # 计算列表各个元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]

# 提供了两个列表,对相同位置的列表数据进行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]

 注意2:  自己定义排序函数:

python3 里是放在functools.cmp_to_key()里面

sorted([5, 2, 4, 1, 3], key=cmp_to_key(reverse_numeric))

reverse = True  降序排列

reverse = False 升序排列

默认False,升序排列

class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        num = map(str,nums)
        #python 3里,这里对指定函数做映射,把nums全部转换成字符串存储到num里面
        def compare(x,y):
            if x+y == y+x:
                return 0
            if x + y> y+x:
                return 1
            else:
                return -1
        num = sorted(num,key=functools.cmp_to_key(compare),reverse = True)
        return ''.join(num) if num[0] != '0' else'0'
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值