解题思路
这是一个字符串排序问题。需要将数字转换为字符串,然后通过自定义排序规则将它们拼接成最大的整数。
关键点:
- 自定义排序规则
- 字符串拼接
- 处理多组测试数据
- 比较两个数字的拼接顺序
算法步骤:
- 将数字转换为字符串
- 自定义排序规则比较两个字符串
- 按规则排序所有字符串
- 拼接得到结果
代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
static bool compare(const string& a, const string& b) {
return a + b > b + a;
}
string solve(vector<int>& nums) {
// 转换为字符串
vector<string> strs;
for (int num : nums) {
strs.push_back(to_string(num));
}
// 按自定义规则排序
sort(strs.begin(), strs.end(), compare);
// 拼接结果
string result;
for (const string& s : strs) {
result += s;
}
return result;
}
};
int main() {
int n;
while (cin >> n) {
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
Solution solution;
cout << solution.solve(nums) << endl;
}
return 0;
}
import java.util.*;
public class Main {
static class Solution {
public String solve(int[] nums) {
// 转换为字符串数组
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
strs[i] = String.valueOf(nums[i]);
}
// 自定义排序规则
Arrays.sort(strs, (a, b) -> (b + a).compareTo(a + b));
// 拼接结果
StringBuilder result = new StringBuilder();
for (String s : strs) {
result.append(s);
}
return result.toString();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = sc.nextInt();
}
Solution solution = new Solution();
System.out.println(solution.solve(nums));
}
sc.close();
}
}
import functools
class Solution:
def solve(self, nums: list) -> str:
# 将数字转换为字符串并自定义排序
def compare(x, y):
return int(y + x) - int(x + y)
# 转换为字符串并排序
nums = list(map(str, nums))
nums.sort(key=functools.cmp_to_key(compare))
# 拼接结果
return ''.join(nums)
# 读取输入
while True:
try:
n = int(input())
nums = list(map(int, input().split()))
solution = Solution()
print(solution.solve(nums))
except EOFError:
break
算法及复杂度
- 算法:自定义排序
- 时间复杂度:,其中 是数字的个数
- 空间复杂度:,用于存储字符串数组