排序问题:
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'