十大基础排序算法可学习链接
leetcode179. 最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例如下:
输入:nums = [3,30,34,5,9]
输出:“9534330”
思路分析
转换成排序问题
算法步骤:
- 将nums中的各数字转化成字符串格式,保存在int2str中,
- 应用以上自定义排序规则,对int2str中字符串执行排序
- 拼接int2str中的所有字符串
NOTE:
我们还需要考虑一种特殊的情况:前导0 例如:输入[0,0],输出因该为 “0” 而不是“00”。因为字符串数组是自定义降序,我们可以检查排好序的字符串数组的第一个元素是否为0:
- 如果第一个元素为0,说明后续若还有元素,也只能是0了,结果必然是0。
- 如果第一个元素不为0,则不会出现前导0的特殊情况。
class Solution {
public:
string largestNumber(vector<int>& nums) {
string ans = "";
vector<string> int2str;
//原int数组转为字符串数组
for(auto x : nums){
int2str.push_back(to_string(x));
}
sort(int2str.begin(), int2str.end(), [](const auto& x, const auto& y){return x+y > y+x;});//按降序排列
if(int2str[0] == "0")
return "0";//若开头是0,后面全是0
//排好序直接拼接即可
for(const auto& s : int2str){
ans += s;
}
return ans;
}
};
关于c++ lambda匿名函数的写法可以学习 链接
也可以不转换为string,直接排序
class Solution {
public:
string largestNumber(vector<int>& nums) {
string ans = "";
sort(nums.begin(), nums.end(), [](const int& x, const int& y){
long ratio_x = 10, ratio_y = 10;
while(x >= ratio_x){
ratio_x *= 10;
}
while(y >= ratio_y){
ratio_y *= 10;
}
return ratio_y*x + y > ratio_x*y + x;
});
if(nums[0] == 0) return "0";
for(auto& x : nums){
ans += to_string(x);
}
return ans;
}
};