38
38
39
39
<!-- 这里可写通用的实现逻辑 -->
40
40
41
+ ** 方法一:自定义排序**
42
+
41
43
先转成字符串列表,再对字符串列表进行字典序降序排列。最后将列表所有字符串拼接即可。
42
44
43
45
<!-- tabs:start -->
47
49
<!-- 这里可写当前语言的特殊实现逻辑 -->
48
50
49
51
``` python
50
- from functools import cmp_to_key
51
-
52
52
class Solution :
53
53
def largestNumber (self , nums : List[int ]) -> str :
54
- num_list = list ( map ( str , nums))
55
- num_list .sort(key = cmp_to_key(lambda x , y : int (y + x) - int (x + y) ))
56
- return ' 0 ' if num_list [0 ] == ' 0 ' else ' ' .join(num_list )
54
+ nums = [ str (v) for v in nums]
55
+ nums .sort(key = cmp_to_key(lambda a , b : 1 if a + b < b + a else - 1 ))
56
+ return " 0 " if nums [0 ] == " 0 " else " " .join(nums )
57
57
```
58
58
59
59
### ** Java**
@@ -63,17 +63,111 @@ class Solution:
63
63
``` java
64
64
class Solution {
65
65
public String largestNumber (int [] nums ) {
66
- List<String > numList = new ArrayList<> ();
67
- for (int num : nums) {
68
- numList . add(String . valueOf(num) );
66
+ List<String > vs = new ArrayList<> ();
67
+ for (int v : nums) {
68
+ vs . add(v + " " );
69
69
}
70
- numList. sort((a, b) - > (b + a). compareTo(a + b));
71
- if (" 0" . equals(numList. get(0 ))) return " 0" ;
72
- StringBuilder sb = new StringBuilder ();
73
- for (String s : numList) {
74
- sb. append(s);
70
+ vs. sort((a, b) - > (b + a). compareTo(a + b));
71
+ if (" 0" . equals(vs. get(0 ))) {
72
+ return " 0" ;
73
+ }
74
+ return String . join(" " , vs);
75
+ }
76
+ }
77
+ ```
78
+
79
+ ### ** C++**
80
+
81
+ ``` cpp
82
+ class Solution {
83
+ public:
84
+ string largestNumber(vector<int >& nums) {
85
+ vector<string > vs;
86
+ for (int v : nums) vs.push_back(to_string(v));
87
+ sort(vs.begin(), vs.end(), [ ] (string& a, string& b) {
88
+ return a + b > b + a;
89
+ });
90
+ if (vs[ 0] == "0") return "0";
91
+ string ans;
92
+ for (string v : vs) ans += v;
93
+ return ans;
94
+ }
95
+ };
96
+ ```
97
+
98
+ ### **Go**
99
+
100
+ ```go
101
+ func largestNumber(nums []int) string {
102
+ vs := make([]string, len(nums))
103
+ for i, v := range nums {
104
+ vs[i] = strconv.Itoa(v)
105
+ }
106
+ sort.Slice(vs, func(i, j int) bool {
107
+ return vs[i]+vs[j] > vs[j]+vs[i]
108
+ })
109
+ if vs[0] == "0" {
110
+ return "0"
111
+ }
112
+ return strings.Join(vs, "")
113
+ }
114
+ ```
115
+
116
+ ### ** C#**
117
+
118
+ ``` cs
119
+ using System ;
120
+ using System .Globalization ;
121
+ using System .Collections .Generic ;
122
+ using System .Linq ;
123
+ using System .Text ;
124
+
125
+ public class Comparer : IComparer <string >
126
+ {
127
+ public int Compare (string left , string right )
128
+ {
129
+ return Compare (left , right , 0 , 0 );
130
+ }
131
+
132
+ private int Compare (string left , string right , int lBegin , int rBegin )
133
+ {
134
+ var len = Math .Min (left .Length - lBegin , right .Length - rBegin );
135
+ for (var i = 0 ; i < len ; ++ i )
136
+ {
137
+ if (left [lBegin + i ] != right [rBegin + i ])
138
+ {
139
+ return left [lBegin + i ] < right [rBegin + i ] ? - 1 : 1 ;
140
+ }
141
+ }
142
+
143
+ if (left .Length - lBegin == right .Length - rBegin )
144
+ {
145
+ return 0 ;
146
+ }
147
+ if (left .Length - lBegin > right .Length - rBegin )
148
+ {
149
+ return Compare (left , right , lBegin + len , rBegin );
150
+ }
151
+ else
152
+ {
153
+ return Compare (left , right , lBegin , rBegin + len );
154
+ }
155
+ }
156
+ }
157
+
158
+ public class Solution {
159
+ public string LargestNumber (int [] nums ) {
160
+ var sb = new StringBuilder ();
161
+ var strs = nums .Select (n => n .ToString (CultureInfo .InvariantCulture )).OrderByDescending (s => s , new Comparer ());
162
+
163
+ var nonZeroOccurred = false ;
164
+ foreach (var str in strs )
165
+ {
166
+ if (! nonZeroOccurred && str == " 0" ) continue ;
167
+ sb .Append (str );
168
+ nonZeroOccurred = true ;
75
169
}
76
- return sb. toString ();
170
+ return sb .Length == 0 ? " 0 " : sb . ToString ();
77
171
}
78
172
}
79
173
```
0 commit comments