原题链接:https://www.nowcoder.com/pat/5/problem/4025
代码参考 胡凡上机笔记 作个简单记录
#include<iostream>
#include<algorithm>
#include<string>
/*
简单总结:
这道题一开始的思路大家都有,就是个排序问题,问题是cmp怎么写,
一开始我的思路有点问题,可能能够实现,但实现起来较为复杂,
想的是比较两个字符串,
1)如果最高位不同,小的那个在前
2)如果相同,比较下一个位置,小的在前,直到有一方没有字符了
3)这个时候比较最后一个字符和当前字符串的首位的大小,如果最后一个字符更小,放在前
后来参考了胡凡的算法笔记,答案思路很巧妙,做个简单记录:
对S1和S2,如果S1+S2<S2+S1 那么S1在前,不用麻烦的比较各位置的字符
具体的证明过程就懒得写了,了解这个思想即可
*/
using namespace std;
const int maxn = 10010;
string str[maxn];
bool cmp(string a, string b) {
return a + b < b + a;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> str[i];
}
sort(str, str + n, cmp);
string ans;
for (int i = 0; i < n; i++) {
ans += str[i];
}
while (ans.size() != 0 && ans[0] == '0') {
ans.erase(ans.begin());
}
if (ans.size() == 0)cout << 0;
else cout << ans;
return 0;
}