【Java】 劍指offer(45) 把數組排成最小的數
阿新 • • 發佈:2018-11-13
code .com stringbu print ide san blog int urn
本文參考自《劍指offer》一書,代碼采用Java語言。
更多:《劍指Offer》Java實現合集
題目
輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3, 32, 321},則打印出這3個數字能排成的最小數字321323。
思路
不好的方法:求出所有全排列(類似字符串的排列 ),將數字拼起來,最後求出所有的最小值。這效率太低,且沒有考慮到大數問題。
好的方法:觀察規律,自行定義一種排序規則。
對於數字m和n,可以拼接成mn和nm,如果mn<nm,我們定義m小於n。反之則相反。利用這個排序規則,從小排到大即可實現題目要求。
拼接m和n時,要考慮到大數問題,因此將m和n拼接起來的數字轉換成字符串處理。因為mn和nm的字符串位數相同,因此它們的大小只需要按照字符串大小的比較規則就可以了。
具體實現:將數字存入ArrayList中,通過利用Collections.sort(List<T> list, Comparator<? super T> c)
方法進行排序。Comparator中重寫compar()方法來規定比較規則。
測試算例
1.功能測試(1個數字;多個數字;數字數位有重復)
2.特殊測試(null)
Java代碼
//題目:輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼 //接出的所有數字中最小的一個。例如輸入數組{3, 32, 321},則打印出這3個數 //字能排成的最小數字321323。 public class SortArrayForMinNumber { public String PrintMinNumber(int [] numbers) { if(numbers==null || numbers.length<=0) return ""; ArrayList<String> list = new ArrayList<String>(); for(int number:numbers) list.add(String.valueOf(number)); Collections.sort(list,new Comparator<String>(){ @Override public int compare(String s1,String s2){ String a=s1+s2; String b=s2+s1; return a.compareTo(b); } }); StringBuilder sb= new StringBuilder(); for(String str:list) sb.append(str); return sb.toString(); } }
收獲
1.記住Collections.(List<T> list, Comparator<? super T> c)在重寫compare()方法的使用。
2.小心大數問題,用字符串解決大數問題。
3.遇到類似排序問題,想想自定排序規則是否更加方便。
更多:《劍指Offer》Java實現合集
【Java】 劍指offer(45) 把數組排成最小的數