1. 程式人生 > >把陣列中數字連起來組成一個最小的數字

把陣列中數字連起來組成一個最小的數字

題目描述:輸入一個整型陣列,將數組裡的所有數字連起來組成一個數字,輸出所有可能的數字中最小的一個。

比如現在輸入一個數組 {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;
	}
}