题目
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数
例如 输入:nums = [3,30,34,5,9] 输出:“9534330”
解题思路
Java中Collections.sort方法可以对对象数组排序,可以重写排序方法,类似于C++自己写sort的cmp函数,重写排序方法,就要对两个字符串a和b比较拼接后的大小,容易发现a+b和b+a长度是一样的,如果a+b是大于b+a的,就要把a+b放在前面,例如"3"和"30"拼接,330是大于303的,所以在字符串数组中,"3"要放在"30"前面,重点就在于sort方法里的排序器怎么写,其实很简单,直接上代码。
解题代码
class Solution {
//避免给出的nums数组全是0,例如给了nums是{0,0},我们返回了00,而实际上应该返回0
//有这个测试样例
private boolean onlyZero(int[] nums) {
for(int i : nums) {
if(i!=0) {
return false;
}
}
return true;
}
//比较字符串a和b代表的数的大小,实际上我们只用到a和b等长的情况,因为o1+o2与o2+o1一定等长
//前面判断字符串长度在本题多余
private boolean compareStr(String a,String b) {
if(a.length() > b.length()) {
return true;
}else if(a.length()<b.length()) {
return false;
}else {
for(int i = 0; i < a.length();i++) {
if(a.charAt(i) > b.charAt(i)) {
return true;
}else if(a.charAt(i) < b.charAt(i)) {
return false;
}
}
return false;
}
}
public String largestNumber(int[] nums) {
//如果数组中全是0则返回0,排除这种情况。
if(onlyZero(nums)) {
return "0";
}
List<String> numStr = new ArrayList<>();
for(int num : nums) {
numStr.add(Integer.toString(num));
}
Collections.sort(numStr,new Comparator<String>() {
//重点是这里重写比较方法,如果o1+o2代表的整数值比o2+o1大,就把o1放在o2前面,反之后面。
@Override
public int compare(String o1, String o2) {
if(compareStr(o1+o2,o2+o1)) {
return -1;
}else {
return 1;
}
}
});
//此时数组已经按照拼接最大顺序排序,直接拼接成字符串即可。
StringBuilder sb = new StringBuilder();
for(String s:numStr) {
sb.append(s);
}
return sb.toString();
}
}