这一问就是要将找出各个字符串如何组合才能使得组成的数字最小;
首先我的思路是:关键在于如何寻找任何两个字符串的排列方式,写成一个cmp的bool类型函数,然后用sort,将其排序,然后将所有的字符串相连接成一个较长的字符串,最后输出来,注意去掉前面的0;
在写cmp函数时,我的思路是:从前到后比较两个字符串的每一位,找到第一位不同的时候就返回这位数字的大小比较,如果直到一个字符串结束时都全部一样,就将较短的那个的第一位和较长的那个字符串的对应位比较,例如比较234和23时将2和4比较。
特别注意:在cmp函数中如果有多个比较的时候要注意将较小的部分放成相同的
后来发现这种方法容易出错,借鉴了一下大佬的:可以考虑两个字符串加起来后先后顺序的比较,例如234和34时,只比较23434和34234就可以了,然后注意一下转化函数stroi。。。其实很好记,string to int
最后有个小坑。。当所有的都是0的时候要记得输出一个0。
//
// main.cpp
// 1038
//
// Created by DouglasLee on 18/3/3.
// Copyright © 2018年 DouglasLee. All rights reserved.
//
#include <iostream>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
vector<string> s;
bool cmp1(string s1,string s2){
string ss1=s1+s2;
string ss2=s2+s1;
long k1=stol(ss1);
long k2=stol(ss2);
return k1<k2;
}
bool cmp(string s1,string s2){
int po=0;
int flag=0;
while(s1[po]!='\0'&&s2[po]!='\0')
{
if(s1[po]==s2[po])
po++;
else{
flag=1;
break;
}
}
if(flag==1)
return s1[po]<s2[po];
else if(s1.length()<s2.length()){//s1 比较短,到头了
return s1[0]<s2[po];
}
else
return s1[po]<s2[0];
}
int main(int argc, const char * argv[]) {
int n;
cin>>n;
for(int i=0;i<n;i++){
string tmp;
cin>>tmp;
s.push_back(tmp);
}
sort(s.begin(),s.end(),cmp1);
int size=s.size();
int p=0;
string ss;
for(int i=0;i<size;i++){
ss+=s[i];
//cout<<s[i];
}
while(ss[p]=='0')
p++;
int kkk=0;
while(ss[p]!='\0'){
cout<<ss[p++];
kkk++;
}
if(kkk==0)
cout<<0;
return 0;
}