把数组排成最小的数
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
bool compSizeDif(const string& l, const string& r) {
string tr = r.substr(0, l.size());
int c = l.compare(tr);
if (0 == c) {
//如果相等,看大数的后(m-n)位;如果m-n<=n,直接比较小数和大数的后n位,小的在前,否则大数截取后m-n位,继续第2步
if (r.size() - l.size() <= l.size()) {
return l < r.substr(r.size() - l.size());
} else {
return compSizeDif(l, r.substr(l.size()));
}
}
//位数不同,先比较小数(n位)和大数(m位)的前n位,小的在前,
return c < 0;
}
bool compare(const string& l, const string& r)
{
if (l.size() == r.size()) {//位数相同小的在前
return l < r;
} else if (l.size() < r.size()){
return compSizeDif(l, r);
} else {
return !compSizeDif(r, l);
}
}
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
//1.位数相同小的在前
//2.位数不同,先比较小数(n位)和大数(m位)的前n位,小的在前,
//如果相等,看大数的后(m-n)位;如果m-n<=n,直接比较小数和大数的后n位,小的在前,否则大数截取后m-n位,继续第2步
vector<string> strs;
for (auto num : numbers) {
strs.push_back(to_string(num));
}
sort(strs.begin(), strs.end(), compare);
string ans;
for (auto str : strs) {
ans += str;
}
return ans;
}
};