题目
PAT 1049 Recover the Smallest Number (30)
解题思路
- 1.对于56和345俩个数,56345>34556,要找到最小值,所以排序的话应该要把345放在56前面,即依靠这个(如果A+B>B+A,那么B排序就应该排在A的前面)对所有给出的数字进行排序。
- 2.排在最前的数字,如果有0则去掉,排在后面的第一个为0也不能去掉,例如:2 001 002,输出的最小值应为1002,所以保存数字的话应该应string类型来保存。
代码提示
- 1.排好序后,用
tem_s
保存当前第cnt(cnt初始值为0)个数字除掉0后剩下的值,并利用循环除掉所有的最前面的0,这个时候tem_s
只有为空和不为空俩种情况,即所有输入的数字都为0,或者不是输入的所有的数字都为0俩种情况。
代码
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(string a,string b)
{
return (a+b)<(b+a);
}
int main()
{
int n;cin>>n;
vector<string> s(n);
for (int i = 0; i < n; ++i) {
cin>>s[i];
}
sort(s.begin(),s.end(),cmp);
// int k=0;
int cnt = 0, flag = 0;
string tem_s;
while (true) {
//只要前面是0就减掉,tem_s最后只有俩种情况
tem_s = s[cnt];
while (tem_s[0]=='0') {
tem_s = tem_s.substr(1);
}
if (tem_s.empty()) {
if (cnt+1<s.size()) {
cnt++;
}
else {
//这种是后面没有了且前面全是0,输出0 ,这里flag为0,未改变
break;
}
}
else{
//这种是把0去掉后,tem_s不为空,所以输出出去0的tem_s 和cnt之后的s就可以了,这里用flag置为1记录
flag = 1;
break;
}
}
if (flag) {
cout<<tem_s;
for (int i = cnt+1; i < s.size(); ++i) {
cout<<s[i];
}
}
else
cout<<0;
cout<<endl;
return 0;
}