题目
思路
方法就是使用字符串大小的比较。
已知两个字符串 s1 , s2 ,依次比较它们第i个字符ASCII码的大小,若第i个字符相同,则比较第i+1个字符,直到某个字符串结束或两个字符串某一个字符不同。
比如说:
s1 = “abcde” 和s2 = “abdce” 比较,从第一个字符开始:
a=97, a=97,同; b=98, b=98,同; c=99, d=100,不同;
发现了s2的第3个字符ASCII码比s1的第3个字符大,所以返回值为s1<s2。
得出以下结论:
任意两个字符串s1, s2,若 s1+s2 < s2+s1 ,则s2应排在s1之前才能得到最大的整数。
拿例1说:
3
13 312 343
将这三个字符串进行排序:
因为“13312”小于“31212”,所以312应排在13前面;
因为“343312”大于312343“,所以343应派在312前面。
所以得到的最大整数就是34331213。
代码
#include<bits/stdc++.h>
using namespace std;
int n;
string a[22];
bool cmp(string a,string b)
{
return a+b>b+a;
}
int main()
{
cin>>n;//读入字符串个数
for(int i=1;i<=n;i++)
cin>>a[i];//读入字符串
sort(a+1,a+n+1,cmp);//快速排序
for(int i=1;i<=n;i++)
cout<<a[i];
return 0;
}