劍指Offer-陣列-(8)
阿新 • • 發佈:2018-12-08
知識點/資料結構:陣列
題目描述
輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{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; } }