题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:将数组中的元素排序,每个数组元素的首位数字越小,将其排在越前面。这样排成的数字是最小的。
如题中{3,32,321},
(1)每个数组元素的第一位数字都是3
(2)继续比较第二位数字,其首位数字是3(只有一位),2,2
(3)继续比较第三位数字,其首位数字是3(只有一位),2(只有两位),1 ----------结束
因此排序成321 32 3拼接起来就是321323
我们可以通过定义这样一个比较器去比较两个数字:
public int compare(Integer str1, Integer str2){
String s1 = str1 + "" + str2;
String s2 = str2+ "" + str1;
return s1.compareTo(s2);
}
两个数字相互首尾拼接然后比较
Java代码实现
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if(numbers.length == 0 || numbers == null)
return "";
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < numbers.length; i++){
list.add(numbers[i]);
}
//自定义比较器,首位数字小的排前面
Collections.sort(list, new Comparator<Integer>(){
public int compare(Integer str1, Integer str2){
String s1 = str1 + "" + str2;
String s2 = str2+ "" + str1;
return s1.compareTo(s2);
}
});
StringBuffer res = new StringBuffer();
for(int i : list){
res.append(i);
}
return res.toString();
}
}