题目描述
设有 n 个正整数 a1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入描述
第一行有一个整数,表示数字个数 n。
第二行有 nn 个整数,表示给出的 n 个整数 ai 。
中, 1≤n≤20,1≤ai≤109。
输出描述
输出一个正整数,表示最大的整数
输入输出样例
示例 1
输入
3
13 312 343
输出
34331213
示例 2
输入
4
7 13 4 246
输出
7424613
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
一开始是想通过整数来进行排序的,但是存在问题。例如,对于33和332这样的数,没法进行排序
#include <iostream>
#include <algorithm>
using namespace std;
int a[25];
bool cmp(int a, int b) {
int at = a, bt = b;
int k = 1;
while (a >= k) {
k *= 10;
}
k /= 10;
int m,n;
while (a != 0) {
m = a % 10;
a /= 10;
}
while (b != 0) {
n = b % 10;
b /= 10;
}
if (m != n) return m > n;
else {
return cmp(at % k, bt % k);
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a+n, cmp);
for (int i = 0; i < n; i++) {
cout << a[i];
}
return 0;
}
下面的代码参考了别人的博客,通过字符串来处理排序,又快又简便
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(string a, string b)
{
return (a + b > b + a);
}
int main()
{
int n;
string s[100];
cin >> n;
for(int i = 0; i < n; i++) cin >> s[i];
sort(s, s + n, cmp);
for(int i = 0; i < n; i++) cout << s[i];
return 0;
}