题目描述
给定一个数组,数组中包含若干个整数,数组中整数可能包含前导 0。
你需要将数组中的所有数字拼接起来排成一个数,并使得该数字尽可能小。
例如,给定一个数组 {32,321,3214,0229,87},我们可以将其中的数字排列成多种不同的数,例如 32-321-3214-0229-87 或 0229-32-87-321-3214,而能排列出的最小的数字为 0229-321-3214-32-87。
输出格式
输出能排列出的最小数字。
注意,结果的前导 0 要全部去掉。
样例
输入样例:
5 32 321 3214 0229 87
输出样例:
22932132143287
算法1
分析:贪⼼算法
不是按照字典序排列就可以的,必须保证两个字符串构成的数字是最⼩的才⾏,所以cmp函数写成return a + b < b + a;的形式,保证它排列按照能够组成的最⼩数字的形式排列。
因为字符串可能前⾯有0,这些要移除掉(⽤s.erase(s.begin())就可以了~嗯~string如此神奇~~)。
输出拼接后的字符串即可。
注意:如果移出了0之后发现s.length() == 0了,说明这个数是0,那么要特别地输出这个0,否则会什么
都不输出~
C++ 代码
#include<bits/stdc++.h>
using namespace std;
bool cmp(string a,string b)
{
return a+b<b+a;
}
string str[10010];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>str[i];
sort(str,str+n,cmp);
string s;
for(int i=0;i<n;i++)
s+=str[i];
while(s.length()!=0 && s[0]=='0')
s.erase(s.begin());
if(s.length()==0)cout<<0;
cout<<s;
return 0;
}