题目:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路:
1.本题可抽象为一个排序问题,把数组按从小到大排好序,然后遍历,小的放前面,大的放后面,即得所求。 2.问题就在于:这个排序问题中,两个数之间比较的时候,怎么算大,怎么算小。 “456”跟”123”,”456”应该放后面,而”456”>”123”,没问题 ; 而 “3”跟”321”,”3”应该放后面,但”321”>”3”,这个是有问题。 类似的 “12”和”123”,”12321”和”123”,”54345”和”543”等。 4.a+b和b+a是隐形的大数问题,要转换为String。借用String的compareTo()方法比较比较s1=a+”“+b 和s2= b+”“+a的大小。 5.创建比较器按我们定义的规则比较。 6.时间复杂度:
O(nlogn)
。
java实现:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
public String
PrintMinNumber(
int [] numbers) {
String str =
"";
if(numbers ==
null || numbers.length <=
0)
return str;
ArrayList<Integer> al =
new ArrayList<Integer>();
for(
int i =
0; i < numbers.length; i ++){
al.add(numbers[i]);
}
Collections.sort(al,
new Comparator<Integer>(){
public int compare(Integer first, Integer second){
String s1 = first +
"" + second;
String s2 = second +
"" + first;
return s1.compareTo(s2);
}
});
for(
int i : al){
str += i;
}
return str;
}
}