劍指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;
}
}