Jun*_*ior 4 java arrays sorting algorithm
算法问题:给定一个非负整数列表,对其进行排列,以使其形成最大数。
例如,给定[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();
}
}
Run Code Online (Sandbox Code Playgroud)
结果:第3行:错误:未找到用于sort(int [],<anonymous Comparator <Integer >>)的合适方法
有人知道如何修改吗?谢谢!
感谢您提供所有详细的答案,我将代码修改为
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();
}
Run Code Online (Sandbox Code Playgroud)
而且我仍在尝试寻找避免使用多余空间的方法。
原因是int和Integer是不同的类型。 int是一个原语,Integer是它的对象包装。Comparator<T>仅适用于对象;它不适用于原语。
将ints 放入s的容器中Integer,例如an ArrayList<Integer>,然后使用比较器解决问题。
请注意,对于非常大的整数,您的方法可能会失败,因为将两个有效ints 串联可能会产生一个太大而int无法容纳的数字。您可以(s1+s2).compareTo(s2+s1)取而代之的是进行字典比较,这与相同长度数字的数字比较相同。
您必须使用整数
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();
}
}
Run Code Online (Sandbox Code Playgroud)