题目:输入一个正数数组,把数组中所有的数字拼接起来排成一个数,打印能排列出来的数的最小的那一个例如输入{3,32,321} 输出的应该是 321323
这个题目的直观做法是先求出所有可能的排列,然后找到最小的那个。但是n个数字的排列有n!个,时间复杂度太高。
同时应该注意,如果直接将输出类型定义为int类型的话,如果数组中的值比较大,加合完之后的值可能会超出int类型,因此最好用string 类型存储最终结果。
通过这道题我也复习了一下 c++ 的sort 和qsort 的用法(虽然后面代码用的sort )以及对应的cmp 函数的写法。
下面是我实现的代码
class Solution {
public:
static bool cmp(string a,string b){
string t1 = a+b;
string t2 = b+a;
return t1 < t2;
}
string PrintMinNumber(vector<int> numbers){
vector<string> numstr;
for(int i =0;i<numbers.size();i++){
char temp[10];
sprintf(temp,"%d",numbers[i]);
numstr.push_back(temp);
}
sort(numstr.begin(),numstr.end(),cmp);
string result = "";
for(int i=0;i<numstr.size();i++) result+=numstr[i];
return result;
}
};