一、题目
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
输入:nums = [3,30,34,5,9]
输出:“9534330”
输入:nums = [0,0,0,0]
输出:“0”
二、解法
思路:
显然就是将nums进行排序,然后再拼接起来,所以主要问题是排序规则。
- 排序规则:给定字符串a,b,当a+b>b+a时即可
- 也可以用一个long类型,存放拼接的a+b和b+a进行比较
class Solution {
public:
static bool cmp(int &a,int &b){ //long类型的比较规则
int a1=a,b1=b,na=10,nb=10;
long long m=a,n=b;
while(a1/10>=1){
a1/=10,na*=10;
}
while(b1/10>=1){
b1/=10,nb*=10;
}
m=m*nb+b,n=n*na+a;
return m>n;
}
string largestNumber(vector<int>& nums) {
vector<string> strings;
int n=nums.size();
for(int i=0;i<n;++i){
strings.push_back(to_string(nums[i]));
}
sort(strings.begin(),strings.end(),[](const string& a,const string& b){
return (a+b)>(b+a);
});
if(strings[0]=="0") return "0";
string ans="";
for(int i=0;i<n;++i){
ans+=strings[i];
}
return ans;
}
};