目录
题目
题目链接:
测试样例
输入样例
5 32 321 3214 0229 87
输出样例
22932132143287
提交结果截图
算法描述
一、我的思路(已AC)
我的想法是,比较两个数哪个在前哪个在后时,
(1)若两个数存在相同位不同时,如1234 和132 前者第二位比后者第二位小,故1234 < 132
(1)若两个数不存在相同位不同时,如1234 和123,仔细看这两个数,明显123放在前面更好,为什么呢?因为1234的第4位 ‘4’ 比123第1位要大,故1234在高位时则更大。根据这个分析,我写出了cmp()函数,具体见源代码部分,有详细注释。
二、最简单的思路
我做完后搜索了一下其他人的代码,发现基本上都是同一种做法,比较两个数(string类型)a和b时,直接比较a + b和b + a(string类型拼接)即可,若a + b < b + a(string类型直接可以判断),则a在前,反之则b在前,方法很简单。
带详细注释的源代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
bool cmp(string a, string b)
{
int i = 0, j = 0;
//cout << "a = " << a << ", b = " << b << endl;
while (i < a.length() && j < b.length())//检查相同位是否有不同
{
if (a[i] != b[i])//若发现有不同,这可以判断了,如 123 < 1323
return a[i] < b[i];
else
i++, j++;
}
if (i != a.length())//若a更长且a的前部分与b相等
{
while (a[i] == a[0] && i != a.length())//若a的第j为位为与第一位一样,则j往后
i++;
if (a[i] < a[0])//若是比第一位小,则说明放前面更好
return true;
else
return false;
}
else//反之,若b更长且b的前部分与a相等
{
while (b[j] == b[0] && j != b.length())//若b的第j位与第一位一样,则j往后
j++;
if (b[j] < b[0])//若是比第一位小,则说明放前面更好
return false;
else
return true;
}
}
int main()
{
int n;
string tmp, res;
vector<string>num;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> tmp;
num.push_back(tmp);
}
sort(num.begin(), num.end(), cmp);
res = num[0];
for (int i = 1; i < num.size(); i++)
res = res + num[i];
while (res[0] == '0' && res.length() != 1)
res = res.substr(1);//删掉第一位的0
cout << res << endl;
return 0;
}