法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;
    }