排列给出的数据组成一个最大的数。就是一个顺序的问题。
先说一个可能会很容易想到的错误方案:
大的数数字在前面,小的数字在后面
举一个反例说明一下这个方案为什么错:{9,10} 排出来的最大数字是910,但是这样排的结果是109
那我们就来考虑一下,到底按一个什么样的方式排序才是正确的。
对于两个数字A、B来说,如果AB>BA,那么A就应该放在B的前面。(AB表示数字A和B进行拼接)
(这个前面不一定是紧挨着B,还有可能是EACDBF这样)
比如 我现在有一些数字是这样排列的;
ECDBAF
然后
AB>BA ,那么ECDABF>ECDBAF
交换了AB的顺序以后,如果AD>DA,那么A的顺序还要前移。
所以,这个规则就是我们排成最大数的正确规则了。写代码的时候只需要写一下排序规则,然后调用sort函数就可以了。
排序的时候数字已经转化为字符串了,AB和BA这两个字符串的长度是相等的,所以判断数值大小可以直接按字典序比较。
注意有一种特殊的情况{0,0,0,0,0}这样最大数应该是0,而不是00000。需要特判一下
c++
#include<algorithm>
bool cmp(string a,string b)
{
return a+b>b+a;
}
class Solution {
public:
string solve(vector<int>& nums) {
vector<string> S;
for(int i = 0 ; i < nums.size() ; i++)
{
S.push_back(to_string(nums[i]));
}
sort(S.begin(),S.end(),cmp);
if(S[0]=="0")
{
return "0";
}
string ans = "";
for(int i = 0 ;i < S.size() ; i++)
{
ans+=S[i];
}
return ans;
}
};
java
import java.util.*;
public class Solution {
public String solve (int[] nums) {
String[] S = new String[nums.length];
for(int i = 0 ; i < nums.length ; i++)
{
S[i] = String.valueOf(nums[i]);
}
Arrays.sort(S, new Comparator<String>(){
@Override
public int compare(String a,String b){
return (b+a).compareTo(a+b);
}
});
if(S[0].equals("0"))
{
return "0";
}
String ans = "";
for(int i = 0 ;i < S.length ; i++)
{
ans+=S[i];
}
return ans;
}
};
python
class Cmp(str):
def __lt__(a, b):
return a+b>b+a;
class Solution:
def solve(self , nums ):
S = [str(i) for i in nums]
S = sorted(S,key = Cmp)
if S[0] == "0":
return "0"
else:
return "".join(S)

京公网安备 11010502036488号