排列给出的数据组成一个最大的数。就是一个顺序的问题。
先说一个可能会很容易想到的错误方案:
大的数数字在前面,小的数字在后面
举一个反例说明一下这个方案为什么错:{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)