算法问题:给定一个非负整数列表,将它们排列成最大数字。
例如,给定[3,30,34,5,9],最大形成数为9534330。
注意:结果可能非常大,因此您需要返回一个字符串而不是一个整数。
public class Solution {
public String largestNumber(int[] num) {
Arrays.sort(num, new java.util.Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
String s1 = String.valueOf(a), s2 = String.valueOf(b);
return Integer.parseInt(s1 + s2) - Integer.parseInt(s2 + s1);
}
});
StringBuilder builder = new StringBuilder();
for (int i = num.length - 1; i >= 0; i--) builder.append(num[i]);
return builder.toString();
}
}
结果:第3行:错误:找不到合适的排序方法(int [],&lt; anonymous Comparator&lt; Integer&gt;&gt;)
有谁知道如何修改它?谢谢!
感谢您提供所有详细解答,我已将代码修改为
public String largestNumber(int[] num) {
int N = num.length;
String[] aux = new String[N];
for (int i = 0; i < N; i++) aux[i] = String.valueOf(num[i]); // int[] -> String[]
Arrays.sort(aux, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return (int) (Long.parseLong(a + b) - Long.parseLong(b + a)); // note the overflow of int, max + max
}
});
StringBuilder builder = new StringBuilder();
for (int i = N - 1; i >= 0; i--) builder.append(aux[i]);
int sub = 0;
for ( ; sub < builder.length() - 1 && builder.charAt(sub) == '0'; sub++);
return builder.substring(sub).toString();
}
我仍在努力寻找避免使用额外空间的方法。
答案 0 :(得分:5)
原因是int
和Integer
是不同的类型。 int
是原语,Integer
是其对象包装。 Comparator<T>
仅适用于对象;它不适用于原语。
将int
放入Integer
的容器中,比如ArrayList<Integer>
,并使用比较器来解决问题。
请注意,对于非常大的整数,您的方法可能会失败,因为连接两个有效的int
可能会产生一个太大而无法容纳int
的数字。您可以返回(s1+s2).compareTo(s2+s1)
而不是词典比较,这与相同长度的数字的数字比较相同。
答案 1 :(得分:3)
您必须使用整数
Integer[] nums = new Integer[]{3, 30, 34, 5, 9};
public class Solution {
public String largestNumber(Integer[] num) {
Arrays.sort(num, new java.util.Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
String s1 = String.valueOf(a), s2 = String.valueOf(b);
return Integer.parseInt(s1 + s2) - Integer.parseInt(s2 + s1);
}
});
StringBuilder builder = new StringBuilder();
for (int i = num.length - 1; i >= 0; i--) builder.append(num[i]);
return builder.toString();
}
}