最大数

给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。

 注意事项

最后的结果可能很大,所以我们返回一个字符串来代替这个整数。

样例

给出 [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;
    }
}