列印1到最大的n位數:大數問題,全排列實現
阿新 • • 發佈:2019-02-10
題目:
輸入數字n,按順序打印出從1到最大的n位十進位制數。比如,輸入3,則打印出1,2,3,…..,一直到最大的3位數即999。
劍指offer上的題目,典型的大數加法問題,無論是int還是long 型別都可能會溢位。所以在解決大數問題時,通常是使用字串或者陣列實現其功能。
思考:
- 字串String在這裡需要不斷做改變,大家都知道String是不可變的,所以每次都需要新建String物件。因此,採用陣列方式,字元 int均可;
- 劍指offer上程式碼對全排列表述重複,再次做小修改。
//最重要遞迴函式實現全排列
public static void Print_1ToMax_Of_Ndigits (int[] number,
int length,int index)
{
//檢查當前是否 溢位,溢位代表排列已滿,即最後一位已經賦值,直接將當前數字number列印即可;
if(index ==length){
PrintNumber(number);
return;
}
for(int i=0;i<10;i++){
number[index]=i;
PrintMaxOfNdigits(number, length, index+1 );
}
System.out.println("");//最高位變一次,輸出一次空行
}
//列印字元陣列number
public static void PrintNumber(int[] number){
boolean isBeginning0=true;
for(int i=0;i<number.length;i++){
if(isBeginning0&&number[i]!=0)
isBeginning0=false;
if (!isBeginning0){//從第一個非0數字列印
System.out.print(number[i]);
}
}
System.out.print("\t");//一個數字輸出完畢
}
public static void PrintNumber(int n){
if(n<=0)
return;
int[] number = new int[n];
Print_1ToMax_Of_Ndigits(number, n, 0);
}
全排列,演算法中實現時就是在迴圈中指定第一個數字後,再去for指定第二個,第三個;在這期間需要去判斷,指定的位數是否已滿,已滿則直接將這個拼好的 int[] 輸出即可。