题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
import java.util.ArrayList;
public class Solution {
/**
* 特殊的冒泡排序:比较两个字符串s1, s2大小的时候,先将它们拼接起来,
* 比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,
* 所以按这个规则,s2就应该排在s1前面。
* 解题思路:
* 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。
* 关键就是制定排序规则。
* 排序规则如下:
* 若ab > ba 则 a > b,
* 若ab < ba 则 a < b,
* 若ab = ba 则 a = b;
*/
public String PrintMinNumber(int [] numbers) {
if(numbers == null || numbers.length == 0){
return "";
}
//冒泡排序趟数 n趟 n=numbers.length-1
for(int i=0;i<numbers.length-1;i++){
//每趟排序 需要n-i次 numbers.length-1-i
for(int j=0;j<numbers.length-1-i;j++){
long sumPreAfter = Long.valueOf(numbers[j] + "" + numbers[j+1]);
long sumAfterPre = Long.valueOf(numbers[j+1] + "" + numbers[j]);
//如果s1+s2 > s2+s1 那么根据冒泡排序规则 会将s1+s2和s2+s1交换位置,得到大的组合
if(sumPreAfter > sumAfterPre){
int temp = numbers[j];
numbers[j] = numbers[j+1];
numbers[j+1] = temp;
}
}
}
String result = "";
//冒泡排序后的顺序 就是组合最小-->组合最大的顺序
for(int k=0;k<numbers.length;k++){
result += numbers[k];
}
return result;
}
}