题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
这道题就是一步步拼接,先把两个数拼接,得到较小的那个
时间复杂度是O(nlogn)
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
string s;
if(numbers.size()<=0)
return s;
sort(numbers.begin(),numbers.end());
s=to_string(numbers[0]);
string s1,s2;
for(int i=1;i<numbers.size();i++)
{
s1=s+to_string(numbers[i]);
s2=to_string(numbers[i])+s;
if(s1<s2)
s=s1;
else
s=s2;
}
return s;
}
};
有一个在讨论区看到的方法,是对sort函数的很好的应用,关于sort函数的参数的应用。
这里补充一下sort函数的用法:
I)Sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!
II)Sort函数有三个参数:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
Sort函数使用模板:
Sort(start,end,排序方法)
要想自己定义排序方法,就可以定义一个
bool compare(int a,int b){ 排序方法的定义 }
class Solution{
public:
static bool compare(const int &a,const int &b){
string s1=to_string(a)+to_string(b);
string s2=to_string(b)+to_string(a);
return s1<s2;
}
string PrintMinNumber(vector<int> numbers){
string s="";
if(numbers.size()<0)
return s;
sort(numbers.begin(),numbers.end(),compare); //这里就不用给compare函数传参数了
for(int i=0;i<numbers.size();i++)
s+=to_string(numbers[i]);
return s;
}
};