题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323
public class 把数组排成最小的数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] input = {3,32,321};
// PrintMinNumber(input);
System.out.println(PrintMinNumber(input));
}
/*思路:假如3和32合并有332,323两种情况,因为332>323,定义32<3;同理32,321合并有32321,32132,那么我们说321<32
*那么给定的数组按照这种规则,从小到大排列,如测试用例,从小到大排序为321,32,3;最小的数就是把排序后的拼在一起;
*那么写一个排序就可以了*/
public static String PrintMinNumber(int [] numbers) {
if (numbers==null||numbers.length==0) {
return "";
}
int clone[] = numbers.clone();
for (int i = 0; i < clone.length-1; i++) {
int temp = i;
for (int j = i+1; j < clone.length; j++) {
if (Issmall(clone[temp],clone[j])) {
temp = j;
}
}
if (clone[i]!=clone[temp]) {
swap(i,temp,clone);
}
}
String first = String.valueOf(clone[0]);
StringBuffer answer = new StringBuffer(first);
for (int i = 1; i < clone.length; i++) {
answer.append(clone[i]);
}
return answer.toString();
}
private static void swap(int i, int j, int[] clone) {
// TODO Auto-generated method stub
int tempnum = clone[i];
clone[i] = clone[j];
clone[j] = tempnum;
}
private static boolean Issmall(int i, int j) {
// TODO Auto-generated method stub
String iString = String.valueOf(i);
String jString = String.valueOf(j);
String ij = iString+jString;
String ji = jString+iString;
long ijnum = Integer.valueOf(ij);
long jinum = Integer.valueOf(ji);
if (ijnum<=jinum) {
return false;
}else {
return true;
}
}
}