1. 程式人生 > >劍指Offer-陣列-(8)

劍指Offer-陣列-(8)

知識點/資料結構:陣列

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

思路:

最直接的做法應該是先求出逐個陣列所有數字的全排列,然後把每個全排列拼起來,最後求出拼起來數字的最小值。n個數字總共有n!中全排列。

這裡其實是一個隱形的大數問題:把數字轉換成字元型:我們先把陣列中的整數轉換成字串,然後定義比較規則,最後把排序的的陣列中的數字一次打印出來,時間複雜度:O(nlogn)。

程式碼如下:《函式覆寫從新定義比較規則沒搞懂啊2018.12.06 14:33》

//這道題最直接的辦法就是(2018.11.21):求出這個數組裡邊所有數字的全排列,然後把每個排列起來,最後偶求出列後的所有數字的最小值。
import java.util.ArrayList;
import java.util.Collections;
//開始的時候匯入的時候少一個包,下面這個
import java.util.Comparator;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        int n=0;
        String s="";
        ArrayList<Integer> list = new ArrayList<Integer>();
        n = numbers.length;
        for(int i=0;i<n;i++){
            list.add(numbers[i]);//將陣列放入arrayList中
        }
        //實現了Comparator介面的compare方法,將集合元素按照compare方法的規則進行排序
        Collections.sort(list,new Comparator<Integer>(){         
            @Override
            public int compare(Integer str1, Integer str2) {
                // TODO Auto-generated method stub          
                    String s1=str1+""+str2;
                    String s2=str2+""+str1;
                     
                    return s1.compareTo(s2);
                }
            });
         
        for(int i=0;i<n;i++){
            s+=list.get(i);
        }
        return s;
    }
}