题目要求
分析
直接按照字符串处理,可以按照字典序排序。
但这样存在问题:
比如32和321,我们按照字典序进行排序“321”>“32”,但实际上32132<32321,所以compareTo的计算方式需要改变。
我们在Arrays.sort()里加入新的Comparator对象,这是一个接口,所以可以用匿名内部类的语法来创建对象。
核心算法是:
Arrays.sort(array, new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
return (str1+str2).compareTo(str2+str1);
}
});
第一次提交——WA
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
String[] array = new String[num];
for (int i = 0; i < num; i++) {
array[i] = scanner.next();
}
scanner.close();
Arrays.sort(array);
StringBuilder builder = new StringBuilder();
for (int i = num-1; i >= 0; i--) {
builder.append(array[i]);
}
System.out.println(builder);
}
}
随后获取了测试数据4:
in
6
321 32 407 135 13 217
out
4073232121713513
所以就需要把算法改成“分析”中的算法啦!
第二次提交——AC
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
String[] array = new String[num];
for (int i = 0; i < num; i++) {
array[i] = scanner.next();
}
scanner.close();
Arrays.sort(array, new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
return (str1+str2).compareTo(str2+str1);
}
});
StringBuilder builder = new StringBuilder();
for (int i = num-1; i >= 0; i--) {
builder.append(array[i]);
}
System.out.println(builder);
}
}