题目链接:把数组排成最小的数
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分析:首先,思路就是进行一次排列,找出最小的数。但是这样数组个数比较多时会超时。具体代码如下:
class Solution {
public:
vector<string> vvs;
void Perm(vector<string> vs,int len){
if(vs.size()==len){
string s = "";
for(int i = 0;i<vs.size();++i)
s+=vs[i];
vvs.push_back(s);
}
else{
for(int i = len;i<vs.size();++i){
swap(vs[len],vs[i]);
Perm(vs,len+1);
swap(vs[len],vs[i]);
}
}
}
string PrintMinNumber(vector<int> numbers) {
vector<string> vs;
for(int i = 0;i<numbers.size();++i){
string sss = to_string(numbers[i]);
vs.push_back(sss);
}
Perm(vs,0);
string mins = "a";
for(int i = 0;i<vvs.size();++i)
if(vvs[i]<mins)
mins = vvs[i];
return mins;
}
};
思路2:
先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab < ba,则a < b;如果ab > ba,则a > b;如果ab = ba,则a = b。
比较函数的定义是本解决方案的关键。这道题其实就是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。实现代码如下:
class Solution {
public:
string itos(int x){
return (x > 9 ? itos(x / 10) : "") + char(x % 10 + '0');
}
bool cmp(int a, int b){
return itos(a) + itos(b) < itos(b) + itos(a);
}
string PrintMinNumber(vector<int> a) {
sort(a.begin(), a.end(), cmp);
string s = "";
for(int i = 0; i < int(a.size()); ++i)
s += itos(a[i]);
return s;
}
};