• Largest Number


    Largest Number

    问题:

    Given a list of non negative integers, arrange them such that they form the largest number.

    For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

    思路:

      comparator<String> 基数排序

    我的代码:

    public class Solution {
        public String largestNumber(int[] num) {
            if(num == null || num.length == 0) return "";
            StringBuffer sb = new StringBuffer();
            HashMap<Character,List<String>> hm = new HashMap<Character,List<String>>();
            for(int i = 0; i < num.length; i++)
            {
                char c = String.valueOf(num[i]).charAt(0);
                if(hm.containsKey(c))
                {
                    hm.get(c).add(String.valueOf(num[i]));
                }
                else
                {
                    List<String> list = new ArrayList<String>();
                    list.add(String.valueOf(num[i]));
                    hm.put(c,list);
                }
            }
            for(char c = '9'; c >= '0'; c--)
            {
                if(hm.containsKey(c))
                {
                    List<String> list = hm.get(c);
                    Collections.sort(list, new NumberCompare());
                    for(int j = 0; j < list.size(); j++)
                    {
                        sb.append(list.get(j));
                    }
                }
            }
            String rst = sb.toString();
            if(rst.length() != 0 && rst.charAt(0) == '0') return "0";
            return rst;
            
        }
        private class NumberCompare implements Comparator<String>
        {
            public int compare(String one, String two)
            {
                String first = one + two;
                String second = two + one;
                int len = first.length();
                int i = 0;
                while( i < len)
                {
                    char onec = first.charAt(i);
                    char twoc = second.charAt(i);
                    if(onec == twoc)    i++;
                    else if(onec > twoc) return -1;
                    else return 1;
                }
                return 0;
            }
        }
    }
    View Code

    他人代码:

    public class Solution {
        public String largestNumber(int[] num) {
            if (num == null) {
                return null;
            }
            ArrayList<Integer> list = new ArrayList<Integer>();
            for (int n1: num) {
                list.add(n1);
            }
            
            Collections.sort(list, new Comparator<Integer>(){
                public int compare(Integer o1, Integer o2) {
                    String s1 = "" + o1 + o2;
                    String s2 = "" + o2 + o1;
                    
                    return s2.compareTo(s1);
                }
            });
            StringBuilder sb = new StringBuilder();
            for (int n: list) {
                sb.append(n);
            }
            if (sb.charAt(0) == '0') {
                return "0";
            }  
            return sb.toString();
        }
    }
    View Code

    学习之处:

    • comparator的应用现状已经完全无压力了
    • 被人的代码虽然简洁,但是分开进行排序,速度更快。
  • 相关阅读:
    Codeforces Round #415 (Div. 2) C. Do you want a date?
    Lifting the Stone 计算几何 多边形求重心
    计算几何 多边形面积 和 重心 的求法
    POJ 3304 segments 线段和直线相交
    LibreOJ #114. k 大异或和
    LibreOJ #113. 最大异或和
    对于各种各样平衡树的比较
    数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
    替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
    红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4350287.html
Copyright © 2020-2023  润新知