面試題 12

1 題目描述

題目:輸入數字 n, 按順序打印從 1 到 最大位 n 位十進制數。
比如輸入 3 打印 1,2,3 一直打印到 999


2 解法描述

1 乍看之下的解法

public static void  print12Max(int n){
    int result=1;
    int i;
    if(n<=0) return;
    for(i=0;i<n;i++){
        result*=10;
    }   
    for(i=1;i<result;i++){
        System.out.println(i);
    }
}

存在問題;當 n 值很大時會導致越界出現錯誤情況,沒有考慮大數情況


2 在字符數組上模擬數字加法,解決大數溢出問題

public static void  print12Max_1(int n){
    //用長度爲 n 的字符數組表示數字
    char[] number=new char[n];
    int i;
    if(n<=0) return;
    for(i=0;i<n;i++){
        number[i]='0';
    }
    while(increment(number)){
        printResult(number);
    }

}


private static boolean increment(char[] number){
    boolean overflow=true;
    int takeover=0;
    int i;
    int len=number.length-1;
    for(i=len;i>=0;i--){
        int sum=number[i]-'0'+takeover;
        if(i==len){
            sum++;
        }
        if(sum>=10){
            if(i==0){
                overflow=false;
                break;
            }else{
                number[i]='0';
                takeover=1;
            }
        }else{
            number[i]=(char) (sum+'0');
            break;
        }               
    }       
    return overflow;
}
private static void printResult(char[] number){
    boolean flag=true;
    for(int i=0;i<number.length;i++){
        if(number[i]=='0'&&flag){
        }else{
            flag=false;
            System.out.print(number[i]);
        }
    }
    System.out.println();
}

上述代碼使用字符數組模擬整數的加法,代碼有點長,接下來換一種思路來考慮這個問題,n 位所有的十進制數其實就是 n 個從 0 到 9 的全排列,也就誰說,我們把數字的每一位從 0 到 9 排列一遍,就得到了所有的十進制數,只是打印的時候,數字排在前面的 0 不打印出來。
比如 n=10 時
依次打印
0000000001
……
0000000009
0000000010
……
9999999999

public static void  print12Max_2(int n){
    if(n<=0) return;
    char[] number=new char[n];
    for(int i=0;i<n;i++){
        number[i]='0';
    }
    for(int i=0;i<10;i++){
        number[0]=(char) (i+'0');
        showRecursive(number,0);
    }
}

private static void showRecursive(char[] number,int index){
    if(index==number.length-1){
        printResult(number);
        return;
    }

    for(int i=0;i<10;i++){
        number[1+index]=(char) (i+'0');
        showRecursive(number,index+1);
    }
}
發佈了48 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章