• lintcode:组成最大的数


    最大数

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

     注意事项

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

    样例

    给出 [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;
        }
    }
  • 相关阅读:
    bower使用记录
    前端生成二维码
    删除顽固node_modules
    vue初体验:实现一个增删查改成绩单
    H5常用代码:适配方案5
    H5常用代码:适配方案4
    H5常用代码:适配方案3
    ARFA 教堂的第四次洗礼&斜率优化重学
    CSP考前总结&周二晚+周三晚模拟考总结&洛谷11月月赛 III Div.1总结
    T44253 绝美的挣扎 题解
  • 原文地址:https://www.cnblogs.com/bbbblog/p/5448606.html
Copyright © 2020-2023  润新知