题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:列出所有可能,并在列的同时记录出现的最小数。
import java.util.ArrayList;
import java.lang.Long;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if(numbers != null&&numbers.length>0){
if(numbers.length==1){//如果长度是1直接返回
return numbers[0]+"";
}else{//否则进行排列组合,并记录最小的数。
long result = 0;//用long避免位数过多溢出
for(int i=0;i<numbers.length;i++){
//递归找出子数组中最小的数
String val = numbers[i]+PrintMinNumber(getSubArray(i,numbers));
long cur = Long.parseLong(val);
if(result>cur||result == 0){
result = cur;
}
}
return result+"";
}
}
return "";
}
public int[] getSubArray(int index,int[] array){
if(array!=null){
int[] result = new int[array.length-1];
for(int i=0;i<array.length;i++){
if(i<index){
result[i] = array[i];
}else if(i>index){
result[i-1] = array[i];
}
}
return result;
}
return null;
}
}