给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。
注意事项
最后的结果可能很大,所以我们返回一个字符串来代替这个整数。
样例
给出 [1, 20, 23, 4, 8]
,返回组合最大的整数应为8423201
。
解题
本质上是一种排序,但是排序规则如何定义?
对于20 23 可以组成2023 和2320 显然2320更大应该排在前面
对于5 51 可以组成551 和 515 显然551更大应该排在前面
所以在比较两个数大小的规则应该将两个数链接起来后再比较大小
对于left、right
我们应该比较:leftright 和rightleft 的大小
通过字符串比较如下
public class Solution { /** *@param num: A list of non negative integers *@return: A string */ public String largestNumber(int[] num) { // write your code here ArrayList<String> list = new ArrayList<String>(); for(int i:num) list.add(i+""); Collections.sort(list,new Comparator<String>(){ public int compare(String left,String right){ String leftright = left + right; String rightleft = right + left; return leftright.compareTo(rightleft); } }); String result=""; for(int i =list.size()-1;i>=0;i--) result+= list.get(i); // if(result.equals("00") ||result.equals("0000")||result.equals("00000")) // return "0"; // 去除左边无效的 0 int i = 0; while(i< result.length() && result.charAt(i) =='0') i++; if(i==result.length()) return "0"; return result.substring(i); } }
修改快排的规则
public class Solution { /** *@param num: A list of non negative integers *@return: A string */ public String largestNumber(int[] num) { // write your code here String result = ""; quickSort(num,0,num.length - 1); for(int i = 0;i<num.length;i++) result += num[i]; // 去除左边无效的 0 int i = 0; while(i< result.length() && result.charAt(i) =='0') i++; if(i==result.length()) return "0"; return result.substring(i); } // 可以理解为逆序排序,排序后直接链接起来就是答案 public void quickSort(int[] num,int low,int high){ if(low>high) return; // for(int kk:num) // System.out.print(kk+" "); // System.out.println(); int i= low; int j= high; int x = num[i]; while(i<j){ while(i<j && compare(x,num[j])) j--; if(i<j){ num[i] = num[j]; i++; } while(i<j && compare(num[i],x)) i++; if(i<j){ num[j] = num[i]; j--; } } num[i] = x; quickSort(num,low,i-1); quickSort(num,i+1,high); } // AB > BA 说明A应该在前面,B应该在后面 public boolean compare(int A,int B){ String left = A+""; String right =B+""; String leftright = left + right; String rightleft = right + left; return leftright.compareTo(rightleft) >0; } }