劍指offer 32:把數組排成最小的數--- Java實現

劍指offer每日一題算法題(java解法)

方便日後複習,從今天開始。

算法之行始於足下

[編程題]把數組排成最小的數-- Java實現

------------------------------------------------------------------------------------------------------
題目描述
輸入一個正整數數組,把數組裏所有數字拼 接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字爲321323。其他知識總結:

字符串拼接:
設str1和str2爲整數,把str1和str2拼接後轉化爲字符串的巧妙方法:String s1 = str1 + “” + str2; 中間加空格“”

將整數數組轉化爲字符串數組方法:
(1)String[] str = new String[numbers.length];
for(int i = 0; i < numbers.length;i++){
str[i] = “” + numbers[i]; //也可以用String.valueOf(numbers[i])將整數數組轉化爲字符串數組
}
(2)String[] str = new String[numbers.length];
for(int i = 0; i < len; i++){
str[i] = String.valueOf(numbers[i]); //也可用str[i] = “” + numbers[i];將整數數組轉化爲字符串數組
}

Collections.sort(list,new Comparator()…方法:
(1)Comparator接口,兩個對象要使用compareTo方法比較大小,就必須實現Comparator接口的compare方法,比如String就實現了這個方法,所以可以直接使用compareTo進行比較。sort(List,Comparator):根據指定的Comparable產生順序對List集合元素進行排序*/
在基本數據中,compareTo()是比較兩個Character 對象;在 Boolean中,是用boolean的實例於其它實例進行比較;在String 中,則是按照字典順序進行比較,返回的值是一個int 型。
(2)Collections.sort(List list, Comparator c) 會根據返回值來對list中的數據進行排序。該函數會return 0, 1,-1三個值,這三個數字代表前面和後面要比較的值哪個大哪個小?
如果是“0”表示要比較兩個數字相等,當返回“-1”時候,前面變量排在後面變量的前面(前面數字小),反之則排在後面(1表示前面數字大)。

compareTo()函數
在基本數據中,compareTo()是比較兩個Character 對象;在 Boolean中,是用boolean的實例於其它實例進行比較;在String 中,則是按照字典順序進行比較,返回的值是一個int 型

解題思路:
先將整型數組轉換成String數組,然後將String數組排序,最後將排好序的字符串數組拼接出來。關鍵就是制定排序規則。
排序規則如下:
若ab > ba 則 a > b,
若ab < ba 則 a < b,
若ab = ba 則 a = b;
解釋說明: 比如 “3” < "31"但是 “331” > “313”,所以要將二者拼接起來進行比較

import java.util.*;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        String s="";
        if(numbers.length==0) return s;
        ArrayList<Integer> list=new ArrayList<Integer>();
        for(int i=0;i<numbers.length;i++){
             list.add(numbers[i]);
        }
        //使用了集合排序,把集合傳進來,新建了一個排序器,底層會用數組代替集合再遍歷循環一次
        Collections.sort(list, new Comparator<Integer>(){
        //str1,str2爲集合數組下標,在Comparator類裏面下標會自增1
            public int compare(Integer str1,Integer str2){   
                String s1=str1+""+str2;
                String s2=str2+""+str1;  
                return s1.compareTo(s2);  //把大的拼接字符串放前面
            }
        });
        for(int j:list){
            s+=j;
        }
        return s; 
    }
}
發佈了56 篇原創文章 · 獲贊 11 · 訪問量 2049
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章