题目要求:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路解析:
刚开始没什么思路,只是想把越大的数转为字符串放在后面,越小的数放在前面。之后参考了一篇的博客,一下就明白了。
https://blog.youkuaiyun.com/fanzitao/article/details/7895344
1.先将数组中的数字转为字符串,再将其放入字符串数组中。
2.将数组中的字符串进行排序,目的是小的在前面,大的在后面。排序后将其字符串数组中的所有元素拼接成一个字符串。
3.由于要排序字符串数组,所以我们需要为sort函数自定义一个比较compare函数,比较两个字符串str1, str2大小的时候,先将它们拼接起来,比较str1+str2,和str2+str1哪个大,如果str1+str2大,那说明str2应该放前面,所以按这个规则,str2就应该排在s1前面。
举个例子:
str1=“2” str2=“21”。
s1=str1+str2=“221”;
s2=str2+str1=“212”;
因为s2<s1,所以str2应该放在前面。
4.sort函数的功能就是从小到大排序,但是此次数组中放置的是字符串,所以需要自定义一个比较器(compare)。
代码:
class solution
{
static bool compare(const string& str1, const string& str2)//定义sort函数的比较器
{
string s1 = str1 + str2;
string s2 = str2 + str1;
return s1 < s2;
}
string PrintMinNumber(vector<int> numbers)
{
string res;
if (numbers.size() < 0)
return res;
vector<string> s;
for (size_t i = 0; i < numbers.size(); i++)//将数字全部转为字符串,放入字符串数组中。
{
s.push_back(to_string(numbers[i]));
}
sort(s.begin(), s.end(), compare);//对字符串数组进行排序。
for (size_t i = 0; i < s.size(); i++)//字符串数组排序后,结合成一个字符串,为最小的数。
{
res.append(s[i]);
}
return res;
}
};
注意: 代码中sort中的compare函数,必须要声明为静态成员函数或者全局函数,不能作为普通成员函数,否则会报错。
因为非静态成员函数依赖于具体的对象,而std::sort这类函数是全局的,因此无法在sort函数中调用非静态成员函数。静态成员函数或者全局函数不依赖于具体的对象,可以独立访问,无须创建任何对象实例就可以访问。同时静态成员函数不可以调用类的非静态成员。