1. 程式人生 > >【Java】【演算法練習】輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。

【Java】【演算法練習】輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。

題目描述:

        輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列 {3,32,321},則打印出這三個數字能排成的最小數字為321323。

解題思路:

       解題思路: 比較兩個字串s1 S2的大小的時候,先將它們拼接起來,比較s1+s2和s2+s1哪個大,如果s1+s2大,那麼說明s2應該放在前面,此題巧妙應用了字串拼接的知識, 在Integer.valueOf(numbers[i] + numbers[j])中的  numbers[i] + numbers[j]是字串拼接操作 所以在a與b比較的時候,是按位比較。

解題程式碼:

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        String str = "";
        for (int i=0; i<numbers.length; i++){
            for (int j=i+1; j<numbers.length; j++){
				// Integer.valueOf()的作用是字串轉成int
				int a = Integer.valueOf(numbers[i] + "" + numbers[j]);//精華所在
                // 兩個字串不是簡單的加法,而是字串拼接
				int b = Integer.valueOf(numbers[j] + "" + numbers[i]);//精華所在
				if (a > b) {// 按位比較,小的放在最前面
                    int t = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = t;
                }
                 
            }
        }
        for (int i = 0; i < numbers.length; i++) {
			// String.valueOf()的作用是int轉字串
			str += String.valueOf(numbers[i]);// 此操作還是字串拼接
        }
        return str;

對於上述程式碼做一補充:

在程式碼第七行,程式碼第九行,

int a = Integer.valueOf(numbers[i] + "" + numbers[j]);

在valueOf方法中numbers[i] + "" + numbers[j]其實是字串拼接

例如:int a1 = 10;
        int a2 = 20;
        String b = "";
        System.out.println(a1 + b+a2);

結果如下:1020;

此種程式碼編寫方式巧妙地解決了最終輸出最小數字的比較問題。