题目描述
给定n个可能含有前导0的数字串,将它们按任意顺序拼接,使生成的整数最小。
输入描述
第一行为一个正整数n(1≤n≤104),表示数字串的个数。
第二行给出n个数字串(1≤每个串的长度≤9),用空格隔开。
输出描述
输出一个整数,表示能生成的最小整数(需要去掉前导0)。
样例1
输入 3 53 01 2
输出 1253
解释 按01、2、53的顺序拼接,能得到最小整数1253。
思路:利用sort()函数将字符串排序,再将其依次拼接起来,除去开头0,输出;
#include <iostream>
#include<algorithm>
using namespace std;
static bool cmp(string a,string b){
return a+b<b+a;
} //cmp比较器
int main()
{
int n;
cin>>n; //n个字符串
string a[n];
for(int i=0;i<n;i++) //依次输入
{
cin>>a[i];
}
sort(a, a+n, cmp);//使用sort函数进行排序
string str1;
for(int i=0;i<n;i++){//拼接
str1+=a[i];
}
int sign=0;
for(int i=0;i<str1.length();i++){
if((sign!=0)||(str1[i]!='0'))
cout<<str1[i];
if(str1[i]!='0')
sign=1;
}
if(sign==0)
cout<<0;
//long long int i=stoi(str1);默认为int范围
// cout<<i;
//cout<<atoi(str1.c_str())<<endl;
return 0;
}
Part1:
cmp中的排序标准为 return a+b<b+a; 即拼接后值更小的方式排;
Part2:
当所谓字符串全为0,输出0;
Part3:
初开头0:一方面看开头的数字是否为0,另一方面要防误触非开头0;
a.利用函数将字符串直接转化为数字,利用sscanf() / atoi() / stoi() 函数,but由于本输出结果范围超出int类型(stoi()默认范围为int型,不可用。
b.利用erase()函数
while (result.length() > 1 && result[0] == '0') {
result.erase(result.begin());
}
cout << result << endl;