题目
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 例如输入数组{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;
}
}