题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路如下:
本题意思其实就是,要将数组按照某个规则排序,使得排序后,按顺序排列组成的数字最小。
组合成的数字最小,可以转化为组成的字符串最小,
如果两个字符串sa + sb < sb + sa 则说明sa在前时,两个字符串组成的数字较小
由此代码如下:
class Solution {
public:
//关键点,将数组按照某个规则排序,使排序后的数组顺序组成的数字最小
//排序的规则为,先将两个数字转成字符串,如果sa+sb < sb + sa 说明a应该排在b前面
static bool compare_number(int a, int b){
stringstream ssa;
stringstream ssb;
ssa << a;
ssb << b;
string sa = ssa.str();
string sb = ssb.str();
return sa + sb < sb + sa;
}
string PrintMinNumber(vector<int> numbers)
{
stringstream ss;
sort(numbers.begin(), numbers.end(), compare_number);
for(int i = 0; i < numbers.size(); i++)
{
ss << numbers[i];
}
return ss.str();
}
};