题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分析
主要思想是实现一个比较函数cmp,然后利用这个函数进行排序,得到最终序列,排序方法使用快排,冒泡均可。
代码实现
string PrintMinNumber(vector<int> numbers) {
if(numbers.size()<=0)
return "";
vector<string> strs;
char tmp[256]={'\0'};
for(auto a = numbers.begin();a!=numbers.end();a++)
{
sprintf(tmp ,"%d", *a );
strs.push_back(string(tmp));
}
qsort(strs,0,strs.size()-1);
string res;
for(auto a = strs.begin();a!=strs.end();a++)
{
res+=*a;
}
return res;
}
void qsort(vector<string>&numbers,int start,int end){
if(start>=end)
return;
string value = numbers[end];
int ind = start;
for(int i = start;i<end;i++){
if( cmp(numbers[i],value,0,0)<0){
swap(numbers[i],numbers[ind++]);
}
}
swap(numbers[ind],numbers[end]);
qsort(numbers, start,ind-1);
qsort(numbers, ind+1,end);
}
int cmp(string& a,string& b,int start_a,int start_b){
unsigned long i=start_a,j=start_b;
while(i<a.size()&&j<b.size())
{
if(a[i]>b[j])
return 1;
else if(a[i]<b[j])
return -1;
else{
i++;
j++;
}
}
if(i==a.size()&&j==b.size())
return 0;
else if(i==a.size())
return cmp(a,b,0,j);
else if(j==b.size())
return cmp(a,b,i,0);
return 0;
}
if(numbers.size()<=0)
return "";
vector<string> strs;
char tmp[256]={'\0'};
for(auto a = numbers.begin();a!=numbers.end();a++)
{
sprintf(tmp ,"%d", *a );
strs.push_back(string(tmp));
}
qsort(strs,0,strs.size()-1);
string res;
for(auto a = strs.begin();a!=strs.end();a++)
{
res+=*a;
}
return res;
}
void qsort(vector<string>&numbers,int start,int end){
if(start>=end)
return;
string value = numbers[end];
int ind = start;
for(int i = start;i<end;i++){
if( cmp(numbers[i],value,0,0)<0){
swap(numbers[i],numbers[ind++]);
}
}
swap(numbers[ind],numbers[end]);
qsort(numbers, start,ind-1);
qsort(numbers, ind+1,end);
}
int cmp(string& a,string& b,int start_a,int start_b){
unsigned long i=start_a,j=start_b;
while(i<a.size()&&j<b.size())
{
if(a[i]>b[j])
return 1;
else if(a[i]<b[j])
return -1;
else{
i++;
j++;
}
}
if(i==a.size()&&j==b.size())
return 0;
else if(i==a.size())
return cmp(a,b,0,j);
else if(j==b.size())
return cmp(a,b,i,0);
return 0;
}