1. 程式人生 > >【追求進步】把陣列排成最小的數

【追求進步】把陣列排成最小的數

題目描述

輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 線上程式碼:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
     /*初步的想法是全排列,所有的全排列彼此比較大小。
       根據排列的知識,n個數字總共有n!個排列;
     
      第二種方法:即就是找到排序規則,陣列根據排序規則進行排序則就是最小的數字
          即就是合併之後int溢位的隱患,因此把數字轉換成字串,比較它們的大小隻需要
          按照字串大小的比較規則就可以了。
        */  
        if(numbers==null||numbers.length==0){
            return "";//如果數字是空的,則返回空
        }
        int len=numbers.length;
        String[] str=new String[len];//字串陣列
        StringBuilder  sb=new StringBuilder();
        for(int i=0;i<len;i++){
            str[i]=String.valueOf(numbers[i]);//先將整型陣列轉換成String陣列
        }
        Arrays.sort(str,new Comparator<String>(){
            @Override
            public int compare(String s1, String s2) {
                String c1 = s1 + s2;
                String c2 = s2 + s1;
                return c1.compareTo(c2);
                //比如 "3" < "31"但是 "331" > "313",所以要將二者拼接起來進行比較
            }
        });//將String陣列排序
        for(int i=0;i<len;i++){
            sb.append(str[i]);//將排好序的字串陣列拼接出來
        }
        return sb.toString();
    }
 /*   
 * 解題思路:
 * 先將整型陣列轉換成String陣列,然後將String陣列排序,最後將排好序的字串陣列拼接出來。關鍵就是制定排序規則。
 * 排序規則如下:
 * 若ab > ba 則 a > b,
 * 若ab < ba 則 a < b,
 * 若ab = ba 則 a = b;
 * 解釋說明:
 * 比如 "3" < "31"但是 "331" > "313",所以要將二者拼接起來進行比較
 */
}