zoukankan      html  css  js  c++  java
  • 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的应用现状已经完全无压力了
    • 被人的代码虽然简洁,但是分开进行排序,速度更快。
  • 相关阅读:
    Centos7安装nodejs(npm)
    Centos7安装docker
    在目标服务器Centos7上安装 GitLab Runner
    PC端,知乎在不想登录的情况下一打开就弹出登录框的无痛解决办法
    mac下webstrom卡顿快速解决办法
    解决项目中使用momentJS文件 体积过大的问题
    发布订阅模式及多种实现方式:
    「react进阶」react开发者的不得不知道的八条优化建议
    Gulp、Webpack 有什么区别
    react 源码解析(上)
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4350287.html
Copyright © 2011-2022 走看看