《劍指office》把數組排成最小的數


題目描述
輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字爲321323。
思路:本題的思路比較有跳躍性,需要理解,要求使得得到某種順序,使得按照這種順序排列的數組組成的數字最小,需要重新定義一種比較大小的邏輯(即comparator),用此邏輯來比較兩個字符串的大小:如果mn的值>nm的值,就認爲m>n;如果mn的值<nm的值,就認爲m<n;如果mn==nm的值,就認爲m==n;按照這種邏輯比較m,n兩個字符串,可以將整個數組從小到大排列,於是按照排序後的順序得到的字符串就是值最小的字符串。
①首先將int型的數組轉換爲string[]數組,於是每個元素就是字符串;因爲對於數組中兩個元素拼接後可能超過int的範圍形成大數,因此轉換爲字符串更加合理,同時對於任何類型的對象,都可以通過自定義的比較器進行比較排序;
②構造一個新的比較器MyComparator implements Comparator<.String>,重寫compare(Strings1,String s2)方法定義比較邏輯,對於字符串比較大小,可以使用字符串String自己的compareTo邏輯(注意:Comparator接口中的方法是compare(),字符串類型String的比較方法是compareTo(),名稱不同,String實現的是Comparable接口,裏面定義的是compareTo方法,而比較器Comparator接口中定義的方法是compare(),注意區分),即String類中compareTo中的邏輯是:將String轉化爲char的數組,比較長度,從頭到尾逐個比較,如果兩個char相同就比較下一個,如果不同就返回這個位置的字符的差值char1-char2,之後的char不再比較,例如:”123”.compareTo(“456”),return -3; “456”.compareTo(“2”) return 2; 因此對於長度相同的s1,s2,可以直接調用String的compareTo方法對c1=s1+s2和c2=s2+s1進行比較,結果如果是正數(不一定是1)表示c1對應的值>c2的值,如果結果return是一個負數(不一定是-1)表明c1對應的值<c2,如果return值是0表明c1的值等於c2的值。
③使用自定義的比較器對字符串數組進行排序,這裏不需要再手寫排序算法,就java的類庫中有封裝好的對數組數組和集合進行排序的方法(Collections.sort(list,myComparator<String>))可以用於使用自定義的比較器對集合進行排序;Arrays.sort(array,myComparator<String>)可以用於使用自定義的比較器對數組進行排序;執行該語句之後的array對象就是排序之後的數組了。注意,使用Arrays.sort()時,只要傳入比較器類的對象即可,Arrays會自動根據返回值得正負或者0來排序的。
代碼:

import java.util.ArrayList;
import java.util.*; 
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        //特殊輸入  
        if(numbers==null||numbers.length<=0) return "";  
        //先將int數組轉化成爲String類型的list或者array,這裏使用集合  
        ArrayList<String> list=new ArrayList<String>();  
        for(int i=0;i<numbers.length;i++){  
            list.add(numbers[i]+"");  
        }  
        //使用自定義的比較器進行排序  
        Collections.sort(list,new MyComparator());  
        //排好序之後的數組集合就是需要的值最小的數組,將其拼接之後返回即可  
        String result="";  
        for(int i=0;i<list.size();i++){  
            result+=list.get(i);  
        }  
        return result;  
    }
}
class MyComparator implements Comparator<String>{  
    @Override     //大寫O  
    public int compare(String s1,String s2){            //注意:Comparator接口中的方法是compare()方法  
        String c1=s1+s2;  
        String c2=s2+s1;  
        return c1.compareTo(c2);        //注意:String實現Comparable接口,實現的是compareTo()  
    }  
} 

發佈了37 篇原創文章 · 獲贊 80 · 訪問量 4006
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章