1. 程式人生 > >數字組合問題(貪心演算法)

數字組合問題(貪心演算法)

設有N個正整數,現在需要你設計一個程式,使他們連線在一起成為最大的數字,例3個整數 12,456,342 很明顯是45634212為最大,4個整數 342,45,7,98顯然為98745342最大

程式要求:輸入整數N 接下來一行輸入N個數字,最後一行輸出最大的那個數字!

思路:拿到這題目,看起要來也簡單,看起來也難,簡單在什麼地方,簡單在好像就是尋找哪個開頭最大,然後連在一起就是了,難在如果N大了,假如幾千幾萬,好像就不是那麼回事了,要解答這個題目需要選對合適的貪心策略,並不是把數字由大排到小那麼簡單,網上的解法是將數字轉化為字串,比如a+b和b+a,用strcmp函式比較一下就知道誰大,也就知道了誰該排在誰前面,不過我覺得這個完全沒必要,在這裡我採用一種比較巧妙的方法來解答,不知道大家還記得氣泡排序法不,那是排序最早接觸的一種方法

針對該題:注意看程式中最核心的比較規則是什麼,是這一句if(array[j] > array[j+1] ) 他是以數字大小作為比較準則來返回true或者是false,那麼我們完全可以改變一下這個排序準則,比如23,123,這兩個數字,在我們這個題中它可以組成兩個數字 23123和12323,分明是前者大些,所以我們可以說23排在123前面,也就是23的優先順序比123大,123的優先順序比23小,所以不妨寫個函式,傳遞引數a和b,如果ab比ba大,則返回true,反之返回false

import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int array[] = new int[n];
int temp = 0;
for(int i = 0; i < n; i++){
array[i] = scanner.nextInt();
}
//該題中是將氣泡排序變一個排序規則,也就是例如23,123,在該題中可以組成23123和12323,
//前者大,所以定為23排在123的前面,也就是變為23*pow(10,3)+123,123*pow(10,2)+23
//比較它們的大小後排序,觀察的3和2分別表示123的位數和23的位數
for(int i = 0; i < n; i++){
for(int j = 0; j < n - i -1; j++){
if(Compare(array[j], array[j+1])){
temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
for(int i = 0; i < n; i++){
System.out.print(array[i]);
}
scanner.close();
}


private static boolean Compare(int num1, int num2) {
// TODO Auto-generated method stub
int midNum1 = num1;
int midNum2 = num2;
int count1 = 0;
int count2 = 0;
while(midNum1 > 0){
count1++;
midNum1 /= 10;
}
while(midNum2 > 0){
count2++;
midNum2 /= 10;
}
int a = (int) (num1 * Math.pow(10, count2) + num2);
int b = (int) (num2 * Math.pow(10, count1) + num1);
return (a < b) ? true : false;
}
}