forked from HuberTRoy/leetCode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LargestNumber.py
83 lines (59 loc) · 1.91 KB
/
LargestNumber.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
"""
Given a list of non negative integers, arrange them such that they form the largest number.
Example 1:
Input: [10,2]
Output: "210"
Example 2:
Input: [3,30,34,5,9]
Output: "9534330"
Note: The result may be very large, so you need to return a string instead of an integer.
思路是补位:
9 > 34
位数不够的补齐。
一开始的补位用的是最后一位。测试时发现一个错误:
8247
824
按照一开始的补位规则:
824 会补成 8244
e...虽然调整后通过了测试,不过最终结果是缺少了一些测试例子。
我做的调整是,从补位补最后一个变为补最大的一位。但是:
284
2847 这种情况下,会以
284 2847 排,但应该是:
2847 284
----
所以还是有问题,在Discuss里提个Issue.
---
Python2的话可以用 soted的 cmp参数,不过3中已经不存在了。
暂时不搞了...
测试地址:
https://leetcode.com/problems/largest-number/description/
beat 38%~77%.
"""
class Solution(object):
def largestNumber(self, nums):
"""
:type nums: List[int]
:rtype: str
"""
if not any(nums):
return '0'
max_nums = len(str(max(nums)))
# 2
def mycmp(x, y):
if x + y > y + x:
return 1
else:
return -1
# 测试用下面的可以跑过 2 & 3。
def makeEqual(s, length=max_nums):
if len(s) == length:
return s
# 这种补位会通过测试,但是 Leetcode 的测试并没有包含所有的情况。
x = max(s) * (length - len(s))
return s+x
# 2
return ''.join(sorted(map(str, nums), cmd=mycmp, reverse=True))
# 3
return ''.join(sorted(map(str, nums), key=makeEqual, reverse=True))
# print(sorted(map(str, nums), key=makeEqual, reverse=True))