题目描述
设有n个正整数,将他们连接成一排,组成一个最大的多位整数。
如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。
如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。
输入描述:
有多组测试样例,每组测试样例包含两行,第一行为一个整数N(N<=100),第二行包含N个数(每个数不超过1000,空格分开)。
输出描述:
每组数据输出一个表示最大的整数。
示例1
输入
2 12 123 4 7 13 4 246
输出
12312 7424613
最终AC代码:
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; bool cmp(string s1, string s2){ return (s1+s2)>(s2+s1); //这里很妙!!! } int main(){ int i, n; string s; vector<string> vs; while(scanf("%d", &n) != EOF){ vs.clear(); for(i=0; i<n; i++){ cin>>s; vs.push_back(s); } sort(vs.begin(), vs.end(), cmp); s = ""; for(i=0; i<vs.size(); i++) s += vs[i]; cout<<s<<endl; } return 0; }
总结:题目来源于牛客网,对应的难度好像不小,正确率低于20%。
第一眼看见这个题目时,我就觉得很熟悉,感觉做过类似的题目,故认为应该比较简单了。但真正动手敲代码时,就卡住了。怎么给字串排序呢?举一个例子,就足以说明难点了。
比如:1、排序前:123 12 =>排序后:123 12 ; 2、排序前:121 12 => 12 121。只有这样,才能满足题干组成最大数的条件。
虽然有库,不用自己手写排序算法,但是这个排序逻辑着实不好操作,我在这里折腾了半个小时。(当然,大神可能觉得简单,没啥折腾的)
然后,想到了既然是让排序后的结果能够组成最大的数,那么在排序时不就可以比较吗?于是就有了以下代码:
bool cmp(string s1, string s2){ return (s1+s2)>(s2+s1); //这里很妙!!! }
我没想到,一个看似挺复杂的逻辑,这么一句简洁的代码就解决了!当然思路的转变主要在于,我原先只是比较s1与s2,试图以此得到一个排序逻辑,却一直解决不了。之后转变思路,将s1与s2拼接,那么不就正好满足条件了吗?还是以上面的例子举例:
比如:1、排序前:123 12 => 排序时:s1+s2:12312,s2+s1:12123,一比较后返回true =>排序后:123 12;2、排序前:121 12 => 排序时:s1+s2:12112,s2+s1:12121,一比较后返回false=>排序后:12 121。
这里有一个很大的妙处在于----拼接。于是使得被比较的两端字串长度相等,所以就不存在短串是长串的前半部分的问题了。我也不知道对于此题,是否还有其他前辈总结过,只是这点突然的奇妙思想让我有些激动,因此写下勉励自己可以在今后的题目也多创新一些,写出一些好思路。仅此。