题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路 :通过Collection.sort()方法中的自定义比较器实现。若mn>nm,则说明nm满足要求。
时间复杂度 O(nlogn); 空间复杂度O(2);
public class MaxArray {
public static void main(String[] args) {
int[] numbers = {3,21,1,4,25};
System.out.println(PrintMinNumber(numbers));
}
private static String PrintMinNumber(int [] numbers) {
if(numbers == null || numbers.length == 0){
return null; //对空数组和长度为0的数组进行处理
}
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < numbers.length; i++){
list.add(numbers[i]);
}
// 升序(自定义比较器)
Collections.sort(list, new Comparator<Integer>() {
@Override //重写比较方法
public int compare(Integer n1, Integer n2) {// 实现接口中的方法
//理解这里只是对sort方法中的compare进行了重写
//还是根据返回的01-1来进行排序的
return (n1+""+n2).compareTo(n2+""+n1); //+""将其变成了字符串,前后反了就是最大
}
});
StringBuffer sb = new StringBuffer(); //可变长度的StringBuffer
for(int str : list){
sb.append(str);
}
return sb.toString();
}
}
Arrays.sort 还有种重载形式:sort(T[] a, Comparator<? super T> c) ,这个方法参数的写法用到了泛型,我们还没讲到。我们可以把它理解成这样的形式: sort(Object[] a, Comparator c) ,这个方法的意思是按照比较器 c 给出的比较排序算法,对 Object 数组进行排序。Comparator 接口中定义了两个方法: compare(Object o1, Object o2) 和 equals 方法,由于 equals 方法所有对象都有的方法,因此当我们实现 Comparator 接口时,我们只需重写 compare 方法,而不需重写 equals 方法。Comparator 接口中对重写 equals 方法的描述是:“注意,不重写 Object.equals(Object) 方法总是安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。”。我们只需知道第一句话就OK了,也就是说,可以不用去想应该怎么实现 equals 方法,因为即使我们不显示实现 equals 方法,而是使用Object类的 equals 方法,代码依然是安全的。