输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
* 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
* 直观的思路:求出数组中所有数字的全排列,然后把每个排列拼起来,最后求出拼起来数字的最小值。 n个数字有n!种排列。复杂度高
* 给出两个数字a和b,我们需要确定一个规则,判断a和b哪个排在前面,而不仅仅比较这两个数字的值哪个更大。
* 若ab > ba 则 a > b,
* 若ab < ba 则 a < b,应该打印出ab,a排在b的前面
* 若ab = ba 则 a = b
* 接下里考虑拼接数字,ab或ba可能溢出,这是一个隐形的大数问题。
* 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
* 直观的思路:求出数组中所有数字的全排列,然后把每个排列拼起来,最后求出拼起来数字的最小值。 n个数字有n!种排列。复杂度高
* 给出两个数字a和b,我们需要确定一个规则,判断a和b哪个排在前面,而不仅仅比较这两个数字的值哪个更大。
* 若ab > ba 则 a > b,
* 若ab < ba 则 a < b,应该打印出ab,a排在b的前面
* 若ab = ba 则 a = b
* 接下里考虑拼接数字,ab或ba可能溢出,这是一个隐形的大数问题。
* 解决大数问题的方法可以把数字转换成字符串,比较ab,ba的大小,只需按照字符串的比较规则就可以了。
方法一:自定义一个排序比较器
import java.utils.*;
import org.junit.Test;
public class PrintMin {
//自定义一个比较器
private class MComparator implements Comparator<String>{
public int compare(String s1,String s2){
String c1=s1+s2;
String c2=s2+s1;
return c1.compareTo(c2);
}
}
<span style="white-space:pre"> </span>//快速排序
private void quickSort(String[] array,int start,int end, Comparator<String> comparator){
if(start<end){
int left=start;//记录开始的位置,第一个位置
String pivot=array[start];
while(start<end){
while(start<end && comparator.compare(array[end], pivot)>=0){
end--;
}
array[start]=array[end];
while(start<end && comparator.compare(array[start], pivot)<=0){
start++;
}
array[end]=array[start];
}
array[start]=pivot;//pivot最终位置
quickSort(array,left,start-1,comparator);
quickSort(array,start+1,end,comparator);
}
}
public String printMinNumber(int [] numbers) {
if(numbers == null || numbers.length == 0) return "";
int len=numbers.length;
String[] str=new String[len];
for(int i=0;i<len;i++){
str[i]=String.valueOf(numbers[i]);
}
MComparator comparator=new MComparator();
quickSort(str,0,len-1,comparator);
//将字符串拼接
StringBuilder sb=new StringBuilder();
for(String s:str){
sb.append(s);
}
return sb.toString();
}
@Test
public void testName() throws Exception {
int[] numbers={5,1,21,3,4};
System.out.println(printMinNumber(numbers));
}
}
方法二:利用java已写好的API。
public String PrintMinNumber(int [] numbers) {
if(numbers==null || numbers.length <0){
return null;
}
String[] str=new String[numbers.length];
for(int i=0;i<numbers.length;i++){
str[i]=String.valueOf(numbers[i]);
}
Arrays.sort(str,new Comparator<String>(){
@Override
public int compare(String s1, String s2) {
String c1=s1+s2;
String c2=s2+s1;
return c1.compareTo(c2);
}
});
StringBuilder sb=new StringBuilder();
for(int i=0;i<numbers.length;i++){
sb.append(str[i]);
}
return sb.toString();
}