【发布时间】:2020-01-20 23:03:50
【问题描述】:
问题
给定一个非负整数列表,将它们排列成最大的数。
例如输入:[3,30,34,5,9] 输出:“9534330”
解决方案
public class Solution {
// DO NOT MODIFY THE LIST
public String largestNumber(final List<Integer> a) {
String[] arr = new String[a.size()];
for (int i = 0; i < a.size(); i++) {
arr[i] = String.valueOf(a.get(i));
}
Arrays.sort(arr, new Comparator<String>(){
public int compare(String a, String b){
return (b+a).compareTo(a+b);
}
});
StringBuilder sb = new StringBuilder();
for(String s: arr){
sb.append(s);
}
if(sb.charAt(0) == '0'){ //check if all zeroes are there
return String.valueOf(0);
}
return sb.toString();
}
}
这行得通,但我不知道 - 我不明白 Comparator 做了什么,但我知道通过在代码中交换 (b+a) 和 (a+b) 我们将得到一个升序结果 - 但我是无法理解这是如何在内部工作的。
【问题讨论】:
-
“它们组成最大的数”是什么意思?
-
使用数组的元素我们必须创建尽可能多的数字...所以必须牢记字典顺序输入:[3,30,34,5,9] 输出:“9534330 "
-
FWIW,你可以只使用
Arrays.sort(arr, (a,b) -> (b+a).compareTo(a+b) );而不是你的所有Arrays.sort(...)以提高可读性 -Comparator自 Java 8 起就是@FunctionalInterface。
标签: java string comparator compareto