题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路
本质上是定义排序方式的过程。首先想到的方法是定义比较函数直接比较,相等返回true或false都行,不等则根据长度及内容分别判断,代码逻辑较麻烦:
class Solution {
public:
static bool judge(string a, string b){
if(a == b) return true;
else if(a.size() == b.size()) return a<b;
else {
int i = 0;
while(i<(a.size()<b.size()?a.size():b.size())){
if(a[i]<b[i]) return true;
if(a[i]>b[i]) return false;
i++;
}
if(a.size()<b.size()){
while(i<b.size()&&b[i] == a[0]) i++;
if(b[i]<a[0]) return false;
if(b[i]>=a[0]) return true;
}
if(a.size()>b.size()){
while(i<a.size()&&a[i] == b[0]) i++;
if(a[i]<b[0]) return true;
if(a[i]>=b[0]) return false;
}
}
return true;
}
string PrintMinNumber(vector<int> numbers) {
vector<string> strnum;
for(int i = 0; i < numbers.size(); i++){
strnum.push_back(to_string(numbers[i]));
}
sort(strnum.begin(),strnum.end(), judge);
string res;
for(int i=0 ; i<strnum.size();i++){
res+=strnum[i];
}
return res;
}
};
更简便的方式是将string a 和string b 相加,比较a+b和b+a的大小,简洁明了,不易出错:
/*对vector容器内的数据进行排序,按照 将a和b转为string后
若 a+b<b+a a排在在前 的规则排序,
如 2 21 因为 212 < 221 所以 排序后为 21 2
to_string() 可以将int 转化为string
*/ class Solution {
public:
static bool cmp(int a,int b){
string A="";
string B="";
A+=to_string(a);
A+=to_string(b);
B+=to_string(b);
B+=to_string(a);
return A<B;
}
string PrintMinNumber(vector<int> numbers) {
string answer="";
sort(numbers.begin(),numbers.end(),cmp);
for(int i=0;i<numbers.size();i++){
answer+=to_string(numbers[i]);
}
return answer;
}
};