题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分析:本质上其实是一种排序思想。数组中的两个元素m,n, 如果mn > nm 那么就认定m > n, 只要按照这个规则进行升序排序,然后将排序后的数组元素按顺序组合即可。相当于一个元素“小”,那么他尽量排在高位,这样保证组合起来的值尽可能小,于是可以排序,然后组合。
代码:
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
string result = "";
if (!numbers.empty())
{
vector<string> strNum;
for (auto num : numbers)
{
strNum.push_back(to_string(num));
}
sort(strNum.begin(), strNum.end(), compare);
for (string s : strNum)
result.append(s);
}
return result;
}
static bool compare(string a, string b)
{
string numA = a + b;
string numB = b + a;
return numA < numB; //"升序"
}
};
总结:如果用全排列比较选取最小的,这种办法效率太低。看透本质是关键。