描述
给定一个nums数组由一些非负整数组成,现需要将他们进行排列并拼接,每个数不可拆分,使得最后的结果最大,返回值需要是string类型,否则可能会溢出
示例1
输入:[30, 1]
返回值:"301"
示例2
输入:[2, 20, 23, 4, 8]
返回值:"8423220"
示例3
输入:[2]
返回值:"2"
提示
输出的结果可能非常大,所以你需要返回一个字符串而不是整数
刚开始拿到这个算法,乍一看很简单,就是按第一位数排序,相同时按第二个,依次类推。但是在提交的时候遇到了一个问题,如果单纯用字符串的compareTo()方法来比较大小,会存在一个很大的bug,比如1和10比较的时候,它会判定10比1大,在拼接的时候就会拼接成101,而这两个拼接的答案应为110.于是我陷入了沉思。直到我看到了一个大佬的解法,直接当场想给自己俩大嘴巴子,直接上代码:
public String solve (int[] nums) {
// write code here
ArrayList<String> list = new ArrayList<>();
for(int i = 0;i < nums.length;i++){
list.add(String.valueOf(nums[i]));
}
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String a, String b){ // 重写compare方法,真的绝
return (b + a).compareTo(a + b); // 比较两个字符串加起来的大小
}
});
if(list.get(0).equals("0")){
return "0";
}
StringBuilder sb = new StringBuilder();
for(int i = 0;i < list.size();i++){
sb.append(list.get(i));
}
return sb.toString();
}
一个字,绝!