题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路
思路(1):看到这个题目我第一思路就是将数组里面的数字进行一个全排列,然后再对全排列的所有数字进行比较取最小的;但是该方法费时,费空间。代码不值得用。
思路(2):
1-我们先把int型数组用to_string函数转换成字符串;
2-我们用sort 函数对整个vector 中的字符串进行一个排序,但是这个排序规则需要我们自己设定。
规则:比如数字A和B,会排列成AB和BA 两个数字,若AB<BA ,则我们认为A<B。看具体代码。
3-将排列好的字符串合并成一个字符串输出。
思路(2)代码
class Solution {
public:
bool comp(const string & s1, const string & s2) {
string res1, res2;
res1 = s1 + s2;
res2 = s2 + s1;
return res1 < res2;
}
string PrintMinNumber(vector<int> numbers) {
int len = numbers.size();
string result="";
vector<string> s;
for (int i = 0; i < len; i++) {
string tmp;
tmp = to_string(numbers[i]);
s.push_back(tmp);
}
sort(s.begin(), s.end(), comp);
for (int j = 0; j < len; j++) {
result += s[j];
}
return result;
}
};