题目:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
方法一:先求出所有排列,然后找最小值,复杂度高
方法二:定义比较函数,对于两个数,m和n,如果按mn拼接的数比按nm拼接得到的数小,则定义m<n。按照这种自定义的比较函数将数组排序,然后再顺序将数组中的数拼接起来,即得到拼起来的最小数字。
有几点注意的:
1. 可以将数字转化为字符串处理,拼接的操作只需要相加即可。比较的时候因为mn和nm的长度一致,所以可以直接按字符串比较规则来比较对应的数字大小。
2. 整型转字符串用to_string();字符串转整形用stoi()。
3. 自定义vector排序函数的比较函数时,要定义为static。
参考代码:
在线测试
AC代码
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
string result;
if(numbers.empty())
return result;
sort(numbers.begin(),numbers.end(),compare);
for(int i=0;i<numbers.size();i++)
{
result+=to_string(numbers[i]);
}
return result;
}
static bool compare(int m,int n){
string ms=to_string(m);
string ns=to_string(n);
return ms+ns<ns+ms;
}
};