解题思路:

要注意题目的意思是把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

先将整数转换为字符串,再以字符串形式拼接后进行比较:比较方式如下

A+B 与 B+A 之间比较的问题(注意:这里的A+B并不是A加上B,而是A拼上B),当A+B小于B+A的时候,很明显A要放在B的前面,这样才能使得结果小。 如:

当A = 206,B = 1 此时 A+B = 2061 B+A = 1206 可以看到 A+B > B+A,所以很明显B需要放在A的前面,即B+A,才能使得拼出来的数字最小。


题解步骤如下:

1、先将整型数组转化为字符串型数组

2、定义特定排序规则

3、用定义的排序规则对字符串型数组进行排序

4、将字符串型数组中每个元素拼接起来

5、得到最小的数


对字符串的排序方式右三种: 仿函数,lambda表达式,函数指针

//仿函数
struct Com {
    bool operator() (string a, string b) {
     return a + b < b + a;
    }
};
sort(str.begin(), str.end(), Com()); // Com()为临时对象
//lambda表达式
// 1. 匿名lambda表达式
sort(str.begin(), str.end(), [](string a, string b) {
     return a + b < b + a;
});
// 2.具名lambda表达式
auto lam = [](string a, string b) {
     return a + b < b + a;
 };
sort(str.begin(), str.end(), lam);;

//函数指针
bool static com(string a, string b) {
    return a + b < b + a;
}
//加static的原因:类成员函数有隐藏的this指针,static 可以去this指针
sort(str.begin(), str.end(), com);

题解代码:

struct compare{
    bool operator()(string a,string b){
        return a+b < b+a;
    }
};
string PrintMinNumber(vector<int> numbers) {
    vector<string> v;
    //将整数转变为字符串
    for(int i =0;i<numbers.size();i++){
        v.push_back(to_string(numbers[i]));
    }
    //字符串数组进行排序
    sort(v.begin(),v.end(),compare());
    string result="";
    //字符串拼接
    for(int i =0;i<v.size();i++){
        result+=v[i];
    }
    return result;
}