leetcode 179 题 最大数

leetcode 179 题 题目:最大数

题目描述:

给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。

示例 1:   输入: [10,2]         输出: 210

示例 2:   输入: [3,30,34,5,9]    输出: 9534330

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

 

解决思路:

Arrays.sort()方法的使用,public static <T> void sort( T[]  a, Comparator<? super T>  c)

首先由static可以看出这是一个类方法,通过类Arrays来调用,其次,该方法有两个输入的参数,一个是需要排序的数组a,而且是使用了泛型,任意类型都可以进行排序;其次,一个参数是一个Comparator对象,该对象定义了对数组a进行排序所采用的规则,我们通常在使用Arrays.sort时,都是使用默认的比较器,即按照数值大小进行比较,但此题我们需要自定义一个比较器,要实现自定义的比较器就需要自己写一个类,该类实现了Comparator接口,并在类中重写Comparator中的方法compare,从而实现我们自定义的比较规则。仔细阅读此题,我们在对两个元素(例如a,b)进行排序时,应该按照如下的排序规则,将a放在前面,将b放在后面和将b放在前面,将a放在后面,比较这两种情况下哪一种排列所得的新数是较大的(如果a,b都是字符串的话,就比较容易了,字符串可以进行拼接,整数的话将会非常麻烦),我们的排序结果就是所得新数较大的情况下的排列方式。

综上所述,我们首先需要将需要排序的整数数组转成字符串数组(因为字符串的拼接十分方便),然后调用Arrays.sort()并传入我们自定义的比较器对象进行排序,将排序结果拼接成一个字符串返回,由于在测试时发现测试用例中有“00”这种连零、全零的测试用例,因此应该判断排序后的结果,如果第一个字符就是零,也就对应这种连零、全零的情况,应该直接返回“0”。

 

实现代码如下:

class Solution {
    //自定义比较器,implements Comparator<泛型>,实现该比较器接口,并重写比较器中的compare方法
    //从而让compare方法实现我们自己想要的排序逻辑
    private class myComparator implements Comparator<String>{
        @Override
        public int compare(String a, String b){
            String str1 = a + b;
            String str2 = b + a;
            
            return str2.compareTo(str1);
        }
    }
    
    public String largestNumber(int[] nums) {

        //首先将输入的整数数组转成字符串数组
        String[] strnums = new String[nums.length];
        int i = 0;
        for(int num : nums)
            strnums[i++] = String.valueOf(num);
        
        //调用Arrays.sort 对字符串数组进行排序,并传入我们自定义的比较器对象
        //从而实现自定义的排序逻辑
        Arrays.sort(strnums, new myComparator());
        
        //针对测试用例的特殊情况,单独处理
        if(strnums[0].equals("0"))
            return "0";
        
        //将排序结果拼接成一个字符串
        String result = new String();
        i = 0;
        while(i < strnums.length)
            result += strnums[i++];
        
        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/E_N_T_J/article/details/85237505