给定n个可能含有前导0的数字串,将它们按任意顺序拼接,使生成的整数最小。
这道题其实思路很简单,就是对输入的字符串进行排序,然后就是前导0,和全部为0的情况的特例考虑一下。
但其实事实上会有个小坑点在里面,就是排序不是简单的s1<s2。
因为会有这样的例子:
27,270和270,如果要输出应该是27027027这样比27270270要小!
因此排序应该是s1+s2<s2+s1;
前导0问题,只要加个flag和if语句即可解决。
完整代码如下:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
bool cmp(string s1,string s2){
return s1+s2<s2+s1;
}
int main(){
int n;
cin>>n;
string s[n];
for(int i=0;i<n;i++){
cin>>s[i];
}
sort(s,s+n,cmp);
}
bool flag = false;
for(int i=0;i<n;i++){
for(int j=0;j<s[i].size();j++){
if(flag||s[i][j]!='0'){
flag = true;
cout<<s[i][j];
}
}
}
if(!flag){
cout<<"0";
}
cout<<endl;
return 0;
}