把数组排成最小的数(三十二)
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
代码(已在牛客上 AC)
详见注释.
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
string res;
std::sort(numbers.begin(), numbers.end(), Comp());
for (auto &d : numbers)
res += to_string(d);
return res;
}
private:
// 这道题的关键是找到一种排序方式, 使得 numbers 中的元素从左向右
// 组合最小, 假设现在将 numbers 中的数字都转换为字符串了, 如果按照
// 字典顺序排列的话, 无法得到最小值, 比如 "32" 与 "322", 按照字典排序
// "32" 在 "322" 前面, 但是 "32322" 要比 "32232" 更大, 从这个例子可以看出,
// 排序方式应该以 s1 与 s2 连接起来的结果: (s1 + s2) 与 (s2 + s1) 作为
// 排序的指标.
struct Comp {
bool operator()(int &i, int &j) {
string s1 = to_string(i), s2 = to_string(j);
return (s1 + s2) < (s2 + s1);
}
};
};