示例 1:
输入:nums = [10,2]
输出:”210”
思路
最大组合有一个性质:相邻的数据 a,b要满足 ab>=ba{这里是字符串拼接后的结果比较}
这是一个可排序的全序关系:
可证明
-
反对称 x>=y y>=x => x=y
-
传递 x>=y y>=z => x>=z
-
完全性 x>=y 或 y>=x 必有一个成立
code1 直接字符串排序 _y总
class Solution {
public:
string largestNumber(vector<int>& nums) {
//严格的可排序性质——全序关系
sort(nums.begin(),nums.ends(),[](int x,int y){
auto a=to_string(x),b=to_string(y);
return a+b>b+a;
})
string ans="";
for(auto x: nums) ans+=to_string(x);
//去掉字符的前导零,全是零保留一个
int k=0;
while(k+1<ans.size() && ans[k]=='0') ++k;
return ans.substr(k);
}
};
code2 以0开头的结果一定是零
class Solution {
public:
string largestNumber(vector<int>& nums) {
//严格的可排序性质——全序关系
sort(nums.begin(),nums.end(),[](int x,int y){
auto a=to_string(x),b=to_string(y);
return a+b>b+a;
});
if(nums[0]==0) return "0";
string ans="";
for(auto x: nums) ans+=to_string(x);
return ans;
}
};
code3 更快的比较函数
bool myComp(const int &x,const int &y)
{
long sx = 10, sy = 10;//计算前一个的权重
while (sx <= x) {
sx *= 10;
}
while (sy <= y) {
sy *= 10;
}
return sy * x + y > sx * y + x;
}
class Solution {
public:
string largestNumber(vector<int> &nums) {
sort(nums.begin(), nums.end(),myComp);
if (nums[0] == 0) return "0";
string ret;
for (int &x : nums) {
ret += to_string(x);
}
return ret;
}
};