描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
示例1
输入:
[3,32,321]
复制返回值:
"321323"
思路:
这题可以看出是一道排序的题目,比如a=323,b=43 那么ab=32343,ba=43323,显然应该是a在前,b在后,整体的数值才最小。那么如何去进行比价呢?这里也才采用人家提供的一个很好的思路,将数值转换为字符串,然后通过比较字符串的大小就可以整体的比较值的大小,比如对于整数a,b,将其转换成字符串a,b后,比较字符串a+b和b+a的大小,很神奇吧,仔细想想,字符串相加正好是可以连接起来的,那么a+b就得到字符串32343,b+a就得到字符串43323,比较的是这两个字符串的大小,可以用ASCII码值进行比较,返回小的那个字符串排列,就相当于找到了数值的排列,这样整体排序完后就可以找到最小的数。注意:使用sort方法自定义函数时候,需要定义成static函数,因为sort的调用必须是静态成员。
class Solution {
public:
static bool compare(string a,string b)
{
return a+b<b+a;
}
string PrintMinNumber(vector<int> numbers) {
vector<string> res;
for(int i=0;i<numbers.size();i++)
{
//将数值转化为字符串进行比较
res.push_back(to_string(numbers[i]));
}
sort(res.begin(),res.end(),compare);
string result;
for(int i=0;i<res.size();i++)
{
result+=res[i];
}
return result;
}
};