输入一个正整数数组,把数组里面所有的数字拼接排成一个数,打印能拼接出的所有数字中的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323.
代码
采用比较数组中字符串大小的方法。两个数字m和n能拼接成数字mn和数字nm。
- 如果mn<nm那么说明m应该排在n前面,我们应该打印出mn;
- 如果nm<mn,我们定义n小于m;
- 如果mn=nm,则表示m和n大小相等。
public static String findMinNumberArray(int[] array) {
if (array == null || array.length == 0) {
return "null";
}
sort(array, 0, array.length - 1);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; i++) {
sb.append(array[i]);
}
return sb.toString();
}
/**
* 快排
* @param array
* @param lo
* @param hi
*/
public static void sort(int[] array, int lo, int hi) {
if(lo >= hi){
return ;
}
int index = partition(array,lo,hi);
sort(array, lo, index - 1);
sort(array, index + 1, hi);
}
private static int partition(int []array, int start, int end) {
// 固定的切分方式
int key = array[start];
while(start < end) {
// 从后半部分向前扫描
while(end > start && !isSmall(array[end], key)) {
end--;
}
array[start] = array[end];
// 从前半部分向后扫描
while(start < end && isSmall(array[start],key)) {
start++;
}
array[end] = array[start];
}
array[start] = key;
return end;
}
/**
* 这里是重点
* ab < ba,则a < b
* ab > ba,则b < a
* @param a
* @param b
* @return
*/
private static boolean isSmall(int a, int b) {
String ab = a + "" + b;
String ba = b + "" + a;
// for (int i = 0; i < ab.length(); i++) {
// if (ab.charAt(i) < ba.charAt(i)) {
// return true;
// } else if (ab.charAt(i) > ba.charAt(i)){
// return false;
// } else {
// //相等不考虑
// }
// }
// return false;
// 有现成的就用现成的了
return ab.compareTo(ba) < 0;
}
public static void main(String[] args) {
int[] array = {3, 32, 321};
String result = findMinNumberArray(array);
System.out.print(result);
}