一、问题描述
给定 nn 个正整数 a1,a2,…,ana1,a2,…,an,你可以将它们任意排序。现要将这 nn 个数字连接成一排,即令相邻数字收尾相接,组成一个数。问,这个数最大可以是多少。
输入格式
第一行输入一个正整数 nn(1≤n≤201≤n≤20)。
第二行输入 nn 个正整数 a1,a2,…,ana1,a2,…,an(1≤ai≤1051≤ai≤105)。
样例输入
3
13 312 343
样例输出
34331213
二、代码展示
import java.util.Scanner;
import java.util.Arrays;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int num = scan.nextInt();
scan.nextLine();
String[] str = new String[num];
for(int i = 0; i < num ; i++)
str[i] = scan.next();
Arrays.sort(str , (o1,o2)->(o2+o1).compareTo(o1+o2));
StringBuilder str1 = new StringBuilder();
for(String x:str){
str1.append(x);
}
System.out.println(str1);
scan.close();
}
}
三、Arrays.sort() 排序
Java 的 `Arrays.sort` 方法,通过 Lambda 表达式自定义了排序规则。
Arrays.sort(str, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
1. `Arrays.sort` 方法简介
`Arrays.sort` 是 Java 中用于对数组进行排序的方法。它有多种重载形式,其中一种允许传入一个自定义的比较器(Comparator)来定义排序规则。
2. Lambda 表达式解析
(o1, o2) -> (o2 + o1).compareTo(o1 + o2)
这是一个 Lambda 表达式,用于实现 `Comparator<String>` 接口的 `compare` 方法。具体来说:
参数:
`o1` 和 `o2` 是待比较的两个字符串。
逻辑:
将 `o2` 和 `o1` 连接起来形成新的字符串 `o2 + o1`。
将 `o1` 和 `o2` 连接起来形成新的字符串 `o1 + o2`。
使用 `compareTo` 方法比较这两个新字符串的字典序。
3. 排序规则解释
这个比较器的逻辑实际上是用"按字典序拼接后的结果进行排序",具体来说:
如果 `o2 + o1` 在字典序上小于 `o1 + o2`,则 `o2` 应该排在 `o1` 前面。
反之,如果 `o1 + o2` 小于 `o2 + o1`,则 `o1` 应该排在 `o2` 前面。
这种比较方式常用于将一组数字字符串按拼接后最大的字典序排序。例如,对于字符串数组 `["3", "30", "34", "5", "9"]`,排序后的结果将是 `["9", "5", "34", "3", "30"]`,因为拼接后的字符串 `"9534330"` 是最大的。
4. 示例代码
以下是一个完整的示例,展示如何使用这段代码对字符串数组进行排序:
import java.util.Arrays;
public class CustomSortExample {
public static void main(String[] args) {
String[] str = {"3", "30", "34", "5", "9"};
// 使用自定义比较器排序
Arrays.sort(str, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
// 输出排序后的数组
System.out.println(Arrays.toString(str));
}
}
输出结果:
[9, 5, 34, 3, 30]
5. 注意事项
类型匹配:确保传入 `Arrays.sort` 的数组类型与 Lambda 表达式的参数类型一致。在上面的例子中,`str` 是 `String[]` 类型,因此 Lambda 的参数也是 `String` 类型。
稳定性:`Arrays.sort` 在 Java 8 及之后的版本中使用的是稳定的排序算法(TimSort),因此如果两个元素在比较时被认为是相等的,它们的相对顺序不会改变。
性能:对于大规模的数据集,自定义比较器的性能可能会影响整体排序效率。确保比较逻辑尽可能高效。