题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路
我的思路是按照每一位比较数字的大小,进行排序,但这对于数量级不同,某些数位相同的数来说不能、满足题意,因此参考了网上的教程。
网上的教程先将数组排序,但是按照正常的排序方法显然不行,因此自定义了排序函数,根据字符串的大小来排序。此处涉及到sort函数的一些应用。
关于sort函数的应用
其使用方式如下:
sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填))
如何实现比较函数cmp:
若比较函数不填,则默认按照从小到大的顺序排列。
如果想要从大到小排列可以这样写比较函数:
bool cmp(int a,int b){
return a>b; //可以理解为当a>b时把a放在前面
}
关于本题,核心也是如何重写cmp函数,本题是要是按照字符串拼接后数字最小,因此可以这么写cmp函数:
static bool cmp(int a,int b){
string as=to_string(a),bs=to_string(b);
return as+bs<bs+as;
}
代码
class Solution {
public:
static bool cmp(int a,int b){
string as=to_string(a),bs=to_string(b);
return as+bs<bs+as;
}
string PrintMinNumber(vector<int> numbers) {
sort(numbers.begin(),numbers.end(),cmp);
string str="";
for(auto x:numbers) str+=to_string(x);
return str;
}
};