把陣列中數字連起來組成一個最小的數字
阿新 • • 發佈:2019-02-03
題目描述:輸入一個整型陣列,將數組裡的所有數字連起來組成一個數字,輸出所有可能的數字中最小的一個。
比如現在輸入一個數組 {3,32,321},那麼輸出的最小的數應該是 321323. -------題目來自 劍指offer.
思路:最直接的方法是列出所有的組合情況,然後找出最小的那個數。但是這樣時間複雜度是 n! ,複雜度太大。
另尋思路,我們知道在排序裡面最快的排序演算法時間複雜度為 nlogn,那麼我們可以藉助快速排序的思想進行排序,從而時間複雜度只需要 nlogn。但是快速排序比較的是兩個數的大小,我們現在需要比較的是哪個數應該放在前面哪個數放在後面。比如 上面例子 321 > 32 > 3,但是順序卻是 321 32 3 這樣排。這個時候我們需要自己定義一個比較的函式,來確定哪個數比較“大”應該放在後面,哪個應該比較“小”放在前面。
我們觀察到, 32132 > 32321,而 332 > 323 ,所以321在32前面,32 在 3 前面。所以我們不是比較兩個數誰比較大,而時應該比較兩個數誰放在前面組成的數比較大,思路有了,接下來就是實現了!
先自定義一個比較函式 compare :利用Integer的特性,將整型數字轉換,接著轉換為String型別進行比較。
//自定義一個比較函式,如果 a 大於 b 則輸出 true 否則輸出 false ,大於,不是簡單的 a > b ,而是指 兩個數字連起來,ab > ba public static boolean compare(int a,int b){ boolean p = false; Integer aa = a; Integer bb = b; String aStr = aa.toString() + bb.toString(); String bStr = bb.toString() + aa.toString(); if(Integer.valueOf(aStr) >= Integer.valueOf(bStr)) p = true; return p; }
接下來就利用快速排序的思想進行排序了!排序後再將得到的陣列從頭到尾輸出!
import java.util.Scanner; public class printMinNumber { public static void main(String args[]){ Scanner scan = new Scanner(System.in); while(scan.hasNext()){ int n = scan.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++){ arr[i] = scan.nextInt(); } printMinNumber(arr,n); } } public static void printMinNumber(int[] arr,int n){ qSort(arr,n,0,n - 1); for(int ele : arr) System.out.print(ele); } //快速排序,將陣列元素按照從小到到排序 public static void qSort(int[] arr,int n,int left,int right){ if(left < right){ int index = Partition(arr,n,left,right); qSort(arr,n,left,index - 1); qSort(arr,n,index + 1,right); } } //利用快速排序思想進行排序 public static int Partition(int[] arr,int n,int left,int right){ int temp = arr[left]; while(left < right){ while(left < right && !compare(temp,arr[right])) right--; if(left < right) arr[left++] = arr[right]; while(left < right && compare(temp,arr[left])) left++; if(left < right) arr[right--] = arr[left]; } arr[left] = temp; return left; } //自定義一個比較函式,如果 a 大於 b 則輸出 true 否則輸出 false ,大於,不是簡單的 a > b ,而是指 兩個數字連起來,ab > ba public static boolean compare(int a,int b){ boolean p = false; Integer aa = a; Integer bb = b; String aStr = aa.toString() + bb.toString(); String bStr = bb.toString() + aa.toString(); if(Integer.valueOf(aStr) >= Integer.valueOf(bStr)) p = true; return p; } }