法1:重载比较运算符
如果字符串a拼接b的得到的数字大于b拼接a,那么肯定b应该排在a的前面,我们要就按照这样的次序将排序的比较重载就可以了。
PS:重载比较运算符,如何确定是升序还是降序?1. 核心规则
- 升序:当
a < b返回true时,排序算法会将a放在b前面(即a比b小,按从小到大排列)。 - 降序:当
a > b返回true时,排序算法会将a放在b前面(即a比b大,按从大到小排列)。
std::sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) {
return a.value > b.value; // 降序
});
题解答案如下:
string PrintMinNumber(vector<int>& numbers) {
// write code here
string res = "";
if(numbers.size() == 0) return res;
vector<string> sv;
for(auto& i : numbers){
sv.emplace_back(std::to_string(i));
}
sort(sv.begin(), sv.end(), cmp);
for(auto& i : sv){
res += i;
}
return res;
}
法2:冒泡排序,和法1的思路一样。
string PrintMinNumber(vector<int>& numbers) {
// write code here
string res = "";
if(numbers.size() == 0) return res;
vector<string> sv;
for(auto& i : numbers){
sv.emplace_back(std::to_string(i));
}
for(int i = 0; i < numbers.size() - 1; ++i){
for(int j = 0; j < numbers.size() - i - 1; ++j){
string s1 = sv[j] + sv[j + 1];
string s2 = sv[j + 1] + sv[j];
if(s1 > s2){
swap(sv[j], sv[j+1]);
}
}
}
for(auto & i : sv){
res += i;
}
return res;
}