问题描述:设有n个正整数,将他们连接成一排,组成一个最大的多位整数。如:n=3时,3个整数13,312,343,连成的最大整数为34331213。如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。
输入
2
12 123
输出
12312
对于这个问题,我的第一种想法是直接采用类似与基数排序的算法:对于输入的每一个整数从高位到低位依次比较它们的每一位,大的直接输出,若第一位相同,则比较第二位。算法复杂度过大,有点像暴力破解了,放弃~~~
思考良久,输出是串,那我对于每一个整数都直接采用字符串输入存在容器中,是不是就可以直接按照字符串的比较规则直接对每一个串进行比较呢?
查阅了相关资料,发现了string对象的具体比较规则,是按字典顺序进行比较:
- 若两个string对象的长度不同,且较短的string对象每个字符均与较长的string对象对应位置字符相同,则说较短的对象<较长的对象。
- 若两个string对象在某些位置上字符不一致,则string对象比较的结果是string对象中第一次出现相异字符的比较结果。
举个例子说明一下:
#include<iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N;
cout<<"开始:";
cin>>N;
vector<string> data;
for(int i=0;i<N;++i)
{
string temp;
cin>>temp;
data.push_back(temp);
}
sort(data.begin(),data.end());
for(int i=0;i<data.size();++i)
cout<<data[i]<<"\t";
}
所以,根据这种方法我们可以直接将每个整数以字符串的形式输入,然后对vector中的string对象进行排序,根据题目的要求进行自定义排序规则,因为string对象可以直接采用'+'的形式进行字符串的连接,所以直接将两个string对象相加然后采用字典序比较,即(string1+string2)>(string2+string1)。最后,直接将整个vector中string对象输出,就能够直接得出最终结果了。
综上,只需要将例子中的sort()函数中的比较规则修改一下即可,参考了一个大佬的提示还可以结合c++11中的lambda表达式,从而少写一个函数了。
sort(data.begin(),data.end(),[](string s1,string s2){return (s1+s2)>(s2+s1);});
这样我们就成功的解决这个问题了!
ps:
c++ primer中描述:lambda表达式可以表示一个可调用的代码单元,理解为一个匿名的内联函数即可。
形如:[capture list](parameter list) -> return type { function body }