題目
輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組 {3,32,321},則打印出這三個數字能排成的最小數字爲 321323。
思路
可以看成是一個排序問題,在比較兩個字符串 S1 和 S2 的大小時,應該比較的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1,那麼應該把 S1 排在前面,否則應該把 S2 排在前面。
public String PrintMinNumber(int [] numbers) {
String[] nums = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
nums[i] = numbers[i] + "";
}
Arrays.sort(nums, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o1 + o2).compareTo(o2 + o1);
}
});
StringBuilder result = new StringBuilder();
for (String num : nums) {
result.append(num);
}
return result.toString();
}
冒泡排序
public String PrintMinNumber(int [] numbers) {
if(numbers == null || numbers.length == 0)
return "";
for(int i=0; i < numbers.length; i++){
for(int j = i+1; j < numbers.length; j++){
int num1 = Integer.valueOf(numbers[i]+""+numbers[j]);
int num2 = Integer.valueOf(numbers[j]+""+numbers[i]);
if(num1 > num2){
int temp = numbers[j];
numbers[j] = numbers[i];
numbers[i] = temp;
}
}
}
StringBuilder result = new StringBuilder();
for (int num : numbers) {
result.append(num);
}
return result.toString();
}