把数组排成最小数

Posted by DH on July 18, 2017

题目

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

分析

一般的思想是对这个数组进行全排列,然后拼接成整数,但是这样有一个问题就是如果用int表示,可能会产生溢出。

要解决这个问题就是将整数转化成字符串,然后根据相应的比较字符串的大小。

而比较的规则就是关键。

其实,就是根据我们自己制定的比较规则对字符串数组进行排序。

看一个例子

a=3,b=31

ab=331

ba=313

那么a就应该排在b的后面,数组升序的情况下,就应该是{b,a}.

因此,ab > ba,a > b; ab < ba, a < b; ab=ba, a = b

而这里的> < =并不是一般意义上数值的比较,是针对本题的比较规则的大小排序

有了这个规则,那么本题我们可以:

(1) 将整数数组转化成字符串数组

(2)自定义比较器,对字符串数组进行排序

(3)拼接排序好的字符串数组

代码

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Comparator;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
		if (numbers.length < 1 || numbers == null) {
			return "";
		}
		String [] numbersToStr = new String[numbers.length];
		for(int i = 0; i < numbers.length; i++){
			numbersToStr[i] = String.valueOf(numbers[i]);
		}
		
		Arrays.sort(numbersToStr,new Comparator<String>() {
			public int compare(String str1,String str2){
				
				String strTemp1 =  str1 + str2;
				String strTemp2 =  str2 + str1;
				
				return strTemp1.compareTo(strTemp2);
			}
		});
		
		String result = "";
		for(int j = 0; j < numbersToStr.length; j++){
			
			result += numbersToStr[j];
			
		}
		
		return result;
    }
}