解题思路:
要注意题目的意思是把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
先将整数转换为字符串,再以字符串形式拼接后进行比较:比较方式如下
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;
}