【劍指 Offer 題解】45. 把數組排成最小的數

題目

輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組 {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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章