179.最大数

题目

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

输入:nums = [10,2]
输出:"210"

示例 2:

输入:nums = [3,30,34,5,9]
输出:"9534330"

示例 3:

输入:nums = [1]
输出:"1"

示例 4:

输入:nums = [10]
输出:"10"

排序

首先将int数组转化为String数组。一般而言,是要优先把字典序较大的字符串加入到结果字符串中,但是如果一个字符串是另一个字符串的开头就不一定了。比如a="432",b="43"时,应该优先加入"43",因为43432>43243,那么如果出现这种情况就先比较a+b和b+a的字典序。如果a+b的字典序更大则优先加入a,否则优先加入b。
因此只要定义一个排序规则将优先加入结果字符串的字符串排到前面,最后依次取出即可拼接出最终结果。

 public String largestNumber(int[] nums) {
        String[] s=new String[nums.length];
        for(int i=0;i<nums.length;++i) s[i]=Integer.toString(nums[i]);
        //定义排序规则
        Comparator<String> comparator=new Comparator<>(){
            public int compare(String a,String b){
                for(int i=0;i<a.length()&&i<b.length();++i){
                    if(a.charAt(i)>b.charAt(i)) return -1;
                    else if(a.charAt(i)<b.charAt(i)) return 1;
                }
                if(a.length()==b.length()) return 0;
                else return compare(a+b,b+a);
            }
        };
        Arrays.sort(s,comparator);
        StringBuilder sb=new StringBuilder(new String(""));
        for(String str:s) sb.append(str);
        return sb.charAt(0)=='0'?"0":sb.toString();
  }

原题:179.最大数

posted @ 2021-04-13 13:07  归鸿唱晚  阅读(66)  评论(0编辑  收藏  举报