这题真的太棒了,一开始自己按照ASKII码序来做总是有点偏差。最后去柳诺大神微博查看,当真妙不可言。以下是我个人对本题的一点理解,也不知道对不对:algorithm 中的sort函数进行过优化的快速排序,有一个递归的过程,cmp中,返回s1+s2<s2+s1,实际是一个递归调整的过程,最终的结果是串的任何子部分都不可调整,否则不满足最小。
另外,最后把整个串连接,去除头部的0,很赞!
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
vector<string> num;
bool cmp(string s1,string s2){
//if(s1.length()<s2.length() && s1==s2.substr(0,s1.length()))
//return false;
//else
return s1+s2<s2+s1;
}
int main(){
int N,i;
string str;
cin>>N;
for(i=0;i<N;i++){
cin>>str;
num.push_back(str);
}
sort(num.begin(),num.end(),cmp);
string s;
for(i=0;i<N;i++){
s+=num[i];
}
while(s.length() != 0 && s[0] == '0')
s.erase(s.begin());
if(s.length() == 0) cout << 0;
cout << s;
system("pause");
return 0;
}