链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
设有n个正整数(n ≤ 20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
输入描述:
第一行,一个正整数n。 第二行,n个正整数。
输出描述:
一个正整数,表示最大的整数
示例1
输入
复制3 13 312 343
3 13 312 343
输出
复制34331213
34331213
示例2
输入
复制20 921650139 925571586 931563581 923960668 870548039 358493469 371229218 737101511 514654859 185379933 19421244 117259400 301947570 48520742 79303948 222979736 153546206 250582036 106394401 198125223
20 921650139 925571586 931563581 923960668 870548039 358493469 371229218 737101511 514654859 185379933 19421244 117259400 301947570 48520742 79303948 222979736 153546206 250582036 106394401 198125223
输出
复制931563581925571586923960668921650139870548039793039487371015115146548594852074237122921835849346930194757025058203622297973619812522319421244185379933153546206117259400106394401
931563581925571586923960668921650139870548039793039487371015115146548594852074237122921835849346930194757025058203622297973619812522319421244185379933153546206117259400106394401
思路
将前后结合所得两两比较,所得结合数大的将在前面的半段放前面
易错点
不能直接将所有字符串从大到小降序,因为有一组数据3 31 39,此时答案应该是39331,若直接降序则会得到39313,所以换一种方法进行比较。
#include <bits/stdc++.h>
using namespace std;
bool cmp(const string &a, const string &b) {
return a + b > b + a;
}
int main() {
int n;
cin >> n;
vector<string>a(n);
int flag = 1;
for (int i = 0; i < n; i++) {//这里是为了防止出现000 0这样的数据可惜测试数据里并没有
cin >> a[i];
for (int j = 0; j < a[i].length(); j++) {
if (a[i][j] != '0') {
flag = 0;
break;
}
}
}
sort(a.begin(), a.end(), cmp);
if (flag) {
cout << 0;
return 0;
}
for (int i = 0; i < n; i++) {
cout << a[i];
}
}