【Java】 劍指offer(45) 把數組排成最小的數

本文參考自《劍指offer》一書,代碼採用Java語言。html

更多:《劍指Offer》Java實現合集  java

題目 

  輸入一個正整數數組,把數組裏全部數字拼接起來排成一個數,打印能拼接出的全部數字中最小的一個。例如輸入數組{3, 32, 321},則打印出這3個數字能排成的最小數字321323。數組

思路

  很差的方法:求出全部全排列(相似字符串的排列 ),將數字拼起來,最後求出全部的最小值。這效率過低,且沒有考慮到大數問題。app

  好的方法:觀察規律,自行定義一種排序規則。ide

  對於數字m和n,能夠拼接成mn和nm,若是mn<nm,咱們定義m小於n。反之則相反。利用這個排序規則,從小排到大便可實現題目要求。post

  拼接m和n時,要考慮到大數問題,所以將m和n拼接起來的數字轉換成字符串處理。由於mn和nm的字符串位數相同,所以它們的大小隻須要按照字符串大小的比較規則就能夠了。測試

  具體實現:將數字存入ArrayList中,經過利用Collections.sort(List<T> list, Comparator<? super T> c)方法進行排序。Comparator中重寫compar()方法來規定比較規則。ui

 

測試算例 url

  1.功能測試(1個數字;多個數字;數字數位有重複)spa

  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實現合集 

相關文章
相關標籤/搜索