P1012题目链接
做题过程
先判断看一看数据范围,$1≤n≤20$,$1≤a_i≤{10^9}$,数组内最大长度只能为 $20$,每个数最大长度为$9$
一开始,能清晰的判断出这题考查的是排序,两两字符串对比他们的首位,如果首位相同继续对比下一个数字。但是后认为实现起来会比较困难。对比选数字拼最大结果的问题
如何选出首位最大的数,于是我们可以使用字符串拼接达到目的
原理
假如我们有 $123759804368450$ 和 $54365789062$两个数字
我们可以先试用前后拼接,先后拼接出
$12375980436845054365789062$ 和 $54365789062123759804368450$
可见,如果是首位更大的数字会更大一些,于是我们可以比较他们的差值,使用类似这个排序的代码进行对两数字排序
1
| Arrays.sort(arr,(o1, o2) -> o2.length() - o1.length());
|
但由于限于长度,$long \ int$类型都无法进行运算,我们可以拿出 $BigInteger$进行高精度的运算
1 2 3 4 5 6 7 8 9
| Arrays.sort(arr,(o1, o2) -> { BigInteger diff = new BigInteger(o2+o1).subtract(new BigInteger(o1+o2)); return diff.toString().startsWith("-") ? -1 : 1; });
|
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.math.BigInteger; import java.util.Arrays;
public class P1012 { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws Throwable { int n = Integer.parseInt(br.readLine()); String[] arr = br.readLine().split(" ");
Arrays.sort(arr,(o1, o2) -> { BigInteger diff = new BigInteger(o2+o1).subtract(new BigInteger(o1+o2)); return diff.toString().startsWith("-") ? -1 : 1; }); for (String str : arr) { pw.print(str); } pw.flush(); } }
|
总结
要更熟悉字符串的操作,一些技巧