将数字转换成字符串,对字符串从地位到高位按照位数的大小排序,最后的排序结果是保证高位(字符串左边)是非递减的,在高位相等的基础上,下一个次高位也是非递减的,......。这样就能保证结果最小。
法一、自己编写排序程序
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
vector<string> ves;
int len=0;
for(int i=0;i<numbers.size();i++){
string stemp=to_string(numbers[i]);
reverse(stemp.begin(),stemp.end());
ves.push_back(stemp);
if(len<stemp.size()){
len=stemp.size();
}
}
int k=0,le=0,ri=0;
while(k<len){
for(int i=ves.size();i>0;i--){
for(int j=0;j<i-1;j++){
le=ves[j].size()>k?k:ves[j].size()-1;
ri=ves[j+1].size()>k?k:ves[j+1].size()-1;
if(ves[j][le]>ves[j+1][ri]){
swap(ves[j],ves[j+1]);
}
}
}
++k;
}
string re;
for_each(ves.begin(),ves.end(),[](string& str){reverse(str.begin(),str.end());});
for(int i=0;i<ves.size();i++){
re+=ves[i];
}
return re;
}
};
法二、用sort排序(代码量大大减少。。。)
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
vector<string> ves;
for(int i=0;i<numbers.size();i++){
ves.push_back(to_string(numbers[i]));
}
sort(ves.begin(),ves.end(),[](string& str1,string& str2){return str1+str2<str2+str1;});
string re;
for(int i=0;i<ves.size();i++){
re+=ves[i];
}
return re;
}
};