总结:
1.拼接的字符串最小,可以比较s1+s2 s2+s1的大小,来确定s2和s1谁应该放在最前面
2.利用erase操作删除前置0
#include <iostream>
#include<string>
#include<stdlib.h>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<string.h>
//1038 Recover the Smallest Number
/*
题目大意:
给与一些数字, { 32, 321, 3214, 0229, 87 }
组成最小的数字
输入:
n个数字 数字小于10000 可以用字符串保存
思路:
1.每一次都是开头最小的数字放在前面,若数字第一位相同;
则比较第二位,依次类推
由于数字按照字符输入,则可以直接比较字典顺序,结果错误,因为32 321 3214无法区分
2.将数字从小到大排序;设置目前最小首位数字
算法笔记:
阅读算法笔记后,得到数字拼凑贪心算法策略
若s1+s2<s2+s1则应该把s1放在前面
*/
using namespace std;
bool cmp(string a,string b)
{
return a+b<b+a;
}
int main() {
int n;
cin>>n;
string s[n];
for(int i=0;i<n;i++)
{
cin>>s[i];
}
sort(s,s+n,cmp);
string output;
for(int i=0;i<n;i++)
{
output+=s[i];
}
while(output.size()!=0&&output[0]=='0')
output.erase(output.begin());
if(output.size()==0)cout<<0<<endl;
else cout<<output;
system("pause");
}