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;
}
}