题目:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如:输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323
解题思路:
1.制定一种新的排序规则,数组根据这个规则排序之后能够排成一个最小的数字。
2.要制定新的排序规则,就必须制定新的比较规则,即通过比较m和n,来确定哪一个应该排在前面(即哪一个更“小”)
新的比较规则:
两个数字m和n能够拼接成为数字mn和nm,如果mn
注意
1.因为要比较两个拼接数字mn和nm的大小,拼接的数字可能超过系统能表示的最大数字,所以这还是一个大数问题。
2.我们根据上面的分析制定新的比较规则compare,然后在qsort(如果使用C++的容器就使用sort)中调用该规则,就可以把数组按照我们制定的规则进行排序。按照排序好的数组拼接出的数字是最小的。时间复杂度为O(nlogn)
可以AC的代码【C++版本】
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
//定义一个新的比较规则
//这里必须声明为静态函数
static bool compare(int item1,int item2)
{
//使用to_string把int转换成为string
string m = to_string(item1);
string n = to_string(item2);
//使用string的好处之一就是可以直接用加号(+)来进行拼接
string mn = m+n;
string nm = n+m;
return mn < nm;
}
//按照新的比较规则对数组进行排序
//然后按照排序的顺序进行输出
string PrintMinNumber(vector<int> numbers)
{
string resu;
if(numbers.size() <= 0)return resu;
sort(numbers.begin(),numbers.end(),compare);
//使用范围for循环
for(auto num:numbers){
resu += to_string(num);
}
return resu;
}
int main()
{
vector<int> test{3,32,321};
cout << PrintMinNumber(test) << endl;
return 0;
}