题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组 [3,32,321],则打印出这 3 个数字能排成的最小数字 321323。
样例
输入:[3, 32, 321]
输出:321323
注意:输出数字的格式为字符串。
算法
(比较器) $O(nlogn)$
这道题目的巧妙之处是可以通过自定义排序方式将数组排序得到结果
自定义排序方式:数字类型的 $a < b$ 当前仅当字符串类型的 $a + b < b + a$,即 $ab$ 排列组成的数字小于 $ba$ 排列组成的数字 $ab < ba$
时间复杂度
时间复杂度为排序所需的时间 $O(nlogn)$
C++ 代码
class Solution {
public:
static bool cmp(int a, int b)
{
string sa = to_string(a), sb = to_string(b);
return sa + sb < sb + sa;
}
string printMinNumber(vector<int>& nums) {
sort(nums.begin(), nums.end(), cmp);
string res;
for (auto x : nums) res += to_string(x);
return res;
}
};