Array Greedy Sorting String
Description Given a list of non-negative integers nums, arrange them such that they form the largest number and return it.
Since the result may be very large, so you need to return a string instead of an integer.
Example 1:
Input: nums = [10,2]
Output: "210"
Example 2:
Input: nums = [3,30,34,5,9]
Output: "9534330"
Constraints:
1 <= nums.length <= 100 0 <= nums[i] <= 109 Solutions Solution 1 Thinking
Form the largest number by concatenation. Numeric order and plain lexicographic order both fail: \(9\) should precede \(98\) because \(998>989\) . \(n\le 100\) . Compare \(a+b\) with \(b+a\) to order two strings, sort by that, and join. If the first character is \(0\) , every value was zero, so return \(\texttt{"0"}\) .
Python3 Java C++ Go C# TypeScript JavaScript
class Solution :
def largestNumber ( self , nums : List [ int ]) -> str :
nums = [ str ( v ) for v in nums ]
nums . sort ( key = cmp_to_key ( lambda a , b : 1 if a + b < b + a else - 1 ))
return "0" if nums [ 0 ] == "0" else "" . join ( nums )
1
2
3
4
5
6
7
8
9
10
11
12
13 class Solution {
public String largestNumber ( int [] nums ) {
List < String > vs = new ArrayList <> ();
for ( int v : nums ) {
vs . add ( v + "" );
}
vs . sort (( a , b ) -> ( b + a ). compareTo ( a + b ));
if ( "0" . equals ( vs . get ( 0 ))) {
return "0" ;
}
return String . join ( "" , vs );
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class Solution {
public :
string largestNumber ( vector < int >& nums ) {
vector < string > vs ;
for ( int v : nums ) vs . push_back ( to_string ( v ));
sort ( vs . begin (), vs . end (), []( string & a , string & b ) {
return a + b > b + a ;
});
if ( vs [ 0 ] == "0" ) return "0" ;
string ans ;
for ( string v : vs ) ans += v ;
return ans ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13 func largestNumber ( nums [] int ) string {
vs := make ([] string , len ( nums ))
for i , v := range nums {
vs [ i ] = strconv . Itoa ( v )
}
sort . Slice ( vs , func ( i , j int ) bool {
return vs [ i ] + vs [ j ] > vs [ j ] + vs [ i ]
})
if vs [ 0 ] == "0" {
return "0"
}
return strings . Join ( vs , "" )
}
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 public class Comparer : IComparer < string > {
public int Compare ( string left , string right ) {
return Compare ( left , right , 0 , 0 );
}
private int Compare ( string left , string right , int lBegin , int rBegin ) {
var len = Math . Min ( left . Length - lBegin , right . Length - rBegin );
for ( var i = 0 ; i < len ; ++ i ) {
if ( left [ lBegin + i ] != right [ rBegin + i ]) {
return left [ lBegin + i ] < right [ rBegin + i ] ? - 1 : 1 ;
}
}
if ( left . Length - lBegin == right . Length - rBegin ) {
return 0 ;
}
if ( left . Length - lBegin > right . Length - rBegin ) {
return Compare ( left , right , lBegin + len , rBegin );
}
else {
return Compare ( left , right , lBegin , rBegin + len );
}
}
}
public class Solution {
public string LargestNumber ( int [] nums ) {
var sb = new StringBuilder ();
var strs = nums . Select ( n => n . ToString ( CultureInfo . InvariantCulture )). OrderByDescending ( s => s , new Comparer ());
var nonZeroOccurred = false ;
foreach ( var str in strs ) {
if ( ! nonZeroOccurred && str == "0" ) continue ;
sb . Append ( str );
nonZeroOccurred = true ;
}
return sb . Length == 0 ? "0" : sb . ToString ();
}
}
function largestNumber ( nums : number []) : string {
nums . sort (( a , b ) => {
const [ ab , ba ] = [ String ( a ) + String ( b ), String ( b ) + String ( a )];
return + ba - + ab ;
});
return nums [ 0 ] ? nums . join ( '' ) : '0' ;
}
function largestNumber ( nums ) {
nums . sort (( a , b ) => {
const [ ab , ba ] = [ String ( a ) + String ( b ), String ( b ) + String ( a )];
return + ba - + ab ;
});
return nums [ 0 ] ? nums . join ( '' ) : '0' ;
}
GitHub