將給定非負整數列表中的數字排列成最大數字的2種方法。例如,給定[50,2,1,9],最大數字為95021。
阿新 • • 發佈:2018-11-24
一、題目簡介
編寫一個能將給定非負整數列表中的數字排列成最大數字的函式。例如,給定[50,2,1,9],最大數字為95021。
此處以如下陣列為例:Integer[] num=new Integer[]{51,9,370,82,4,796};
二、例項程式碼
1、方法一:
/** * 1.方法一:判斷每個數的長度,通過在後面補0的方式使所有的數位數相等, * 比較大小排序,得到最大數。 */ public static void firstMeans(){ Integer[] num=new Integer[]{51,9,370,82,4,796}; String[] str=new String[num.length]; int n=5;//設定待使用陣列每個數字最大長度為5位; //長度小於5的數字迴圈在後面補0,直到長度為5; for(int k=0;k<num.length;k++){ str[k]=num[k].toString(); while(str[k].length()<n){ str[k]+="0"; } } //列印補0後按大小排序結果; System.out.println(Arrays.toString(str)); //以氣泡排序的思維對補0後,長度相同的陣列元素進行排序; //排序過程中需要同時交換兩個陣列中的相對位置; for(int i=0;i<num.length-1;i++){ for(int j=i+1;j<num.length;j++){ if(Integer.parseInt(str[i])<Integer.parseInt(str[j])){ int temp1=num[i]; String temp2=str[i]; num[i]=num[j]; str[i]=str[j]; num[j]=temp1; str[j]=temp2; } } } //列印得到最大組合數的陣列; System.out.println("方法1:"+Arrays.toString(num)); String resulte=""; for(int i=0;i<num.length;i++){ resulte+=num[i]; } System.out.println("最終結果_方法1:"+resulte); }
2、方法二:
/** * 2.方法一:兩兩互相組合比較大小,組合方式大的數放在前面(氣泡排序思維); */ public static void secondMeans(){ Integer[] num2=new Integer[]{51,9,370,82,4,796}; for(int i=0;i<num2.length-1;i++){ for(int j=i+1;j<num2.length;j++){ //陣列中的數轉化為字串兩兩互相組合,組合結果轉換為整型; int x=Integer.parseInt(num2[i].toString()+num2[j].toString()); int y=Integer.parseInt(num2[j].toString()+num2[i].toString()); //比較組合結果,組合在前的數組合結果大,就把該數交換到前面的位置; if(x<y){ int temp=num2[i]; num2[i]=num2[j]; num2[j]=temp; } } } //列印得到最大組合數的陣列; System.out.println("方法2:"+Arrays.toString(num2)); String resulte=""; for(int i=0;i<num2.length;i++){ resulte+=num2[i]; } System.out.println("最終結果_方法2:"+resulte); }
三、列印結果
//3.呼叫方法輸出結果;
public static void main(String[] args) {
firstMeans();
secondMeans();
}
[51000, 90000, 37000, 82000, 40000, 79600]
方法1:[9, 82, 796, 51, 4, 370]
最終結果_方法1:982796514370
方法2:[9, 82, 796, 51, 4, 370]
最終結果_方法2:982796514370
四、總結
方法一:給定陣列元素有最大位數的限制,超過設定的位數最終結果將會出錯,而且該方法迴圈使用次數過多,效率低下。
方法二:效率較高,也是網上多數大神使用的方法。