剑指offer:正整数数组拼接最大最小数(调用Comparator)

 题目描述 

 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 
 例如输入数组{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 方法,代码依然是安全的。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值