題目描述
輸入一個正整數數組,把數組里所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字為321323。
這道題目比較數組組成字符之后的大小,所以很自然的想到了大數問題。所以整個過程都要使用字符串來比較和保存。
思路: 並不是a<b那么ab<ba,因為3,31拼成331>313,所以我們應該設置自己的一套比較規則,如果ab<ba那么稱為a<b,所以我們需要做的是把整個數組按照我們的比較規則從小到大排列。然后從頭到尾用字符串的形式串起來。
因為對java不熟,所以沒有用比較器,而是用了傳統的冒泡,調用自己構建的比較函數
比較函數 是把兩個按照字符串的形式串起來然后 調用 str1.compareTo(str2)的方法,若str1大於str2那么返回正值,否則返回負值。
上代碼
import java.util.*; public class Solution { public String PrintMinNumber(int [] numbers) { for(int i=0;i<numbers.length;i++){ for(int j=numbers.length-1;j>i;j--){ if(compare(numbers[j-1],numbers[j])>0){ int temp=numbers[j-1]; numbers[j-1]=numbers[j]; numbers[j]=temp; } } } String ans=""; for(int i=0;i<numbers.length;i++){ ans+=numbers[i]; } return ans; } public int compare(int int1,int int2){ String str1=int1+""+int2; String str2=int2+""+int1; return str1.compareTo(str2); } }
附帶java比較器代碼,這個直接調用sort函數,使用自定義規則比較,直接替換上邊的冒泡過程即可
Collections.sort(list, new Comparator<Integer>(){ public int compare(Integer str1,Integer str2){ String s1=str1+""+str2; String s2=str2+""+str1; return s1.compareTo(s2); } });