题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
题解:可以用全排列的做法找到最小的数,但是这样就会使得最后得结果要在n!个数中进行比较,这样比较的次数和最后的结果个数太多,所有我们可以用下面的办法,只需要在sort()函数中自定义一个Compare,让按照Compare的规则将比较后的数进行排列,得到的就是最小值。
全排列代码链接: https://blog.youkuaiyun.com/ADream__/article/details/105145908
class Solution {
public:
static bool Compare(int a,int b){
string strNum1=to_string(a);//数字转字符串
string strNum2=to_string(b);
return (strNum1+strNum2)<(strNum2+strNum1);
}
string PrintMinNumber(vector<int> numbers) {
string str;
if(numbers.empty())
return str;
sort(numbers.begin(),numbers.end(),Compare);//排序规则
for(int i = 0; i < numbers.size();i++)
str += to_string(numbers[i]);
return str;
}
};
关于sort的第三个参数的定义: 强烈推荐看技术文档
可以看到Compare的定义:Compare函数返回一个bool类型的值,这个值表示了在严格弱排序中(可以理解为升序排序)第一参数是否位于第二个参数之前。
也就是说如果comp返回true,则第一个参数小于第二个参数,sort根据compare的返回值将第一个参数排在第二个参数之前。
如果comp返回false,则第一个参数大于第二个参数,sort根据compare的返回值将第一个参数排在第二个参数之后。
传入A,B,定义bool myfunction (int i,int j) { return (i<j); },作为comp函数,则排列AB。
传入BA,则排列AB。
可以看出是升序排列的。(sort函数默认的comp函数也是默认升序的)
而如果我们定义bool myfunction (int i,int j) { return (i>j); },作为comp函数,
传入AB,返回false,则排列为BA,
传入BA,返回true,排列为BA。
是降序排列的。