劍指offer面試題之:打印從1到最大的n位數 (2種方法實現)

題目:

輸入數字n,按順序打印出從1到最大的n位十進制數,比如輸入3,則打印出1、2、3一直到最大的3位數999

注意:

該題需要考慮大數問題,n的範圍沒有規定,可以很大,所以不能用int 或 long long  類型來存儲概數。

我們用數組存儲(int[]  numbers = new int[number+1])

方法一:在數組上模擬數字加法代碼實現:

/**
 * Created by FHY on 2019/3/21.
 */
public class Print1toNDemo {
    public static void main(String[] args){
        doPrintNumbers(5);
    }

    public static void doPrintNumbers(int number){
        int[] numbers = new int[number+1]; //新建數組,默認初始化爲0
        while(!increment(numbers)){
            //未越界
            doPrint(numbers);
        }
    }

    private static boolean increment(int[] numbers) {
        boolean ifOverFlow = false;
        int nTakeOver = 0; //進位
        int sum = 0;
        int length = numbers.length ;

        for(int i = length - 1; i >= 0; i--){
            sum = numbers[i] + nTakeOver; //本位數+進位
            if(i == length - 1){
                sum ++;
            }
            if(sum >= 10){
                if(i == 1){
                    ifOverFlow = true;
                }else{
                    nTakeOver = 1;
                    sum -= 10;
                    numbers[i] = sum;
                }
            }else{
                numbers[i] = sum;
                break; //若沒有進位,則高位不會再有變化
            }
        }
        return ifOverFlow;
    }

    private static void doPrint(int[] numbers) {
        int i = 0;
        while(i < numbers.length && numbers[i] == 0){
            i++;
        }
        for(; i<numbers.length; i++){
            System.out.print(numbers[i]);
        }
        System.out.println();
    }
}

方法二:把問題轉換成數字排列的解法:

/**
 * Created by FHY on 2019/3/21.
 */
public class Print1toNDemo {
    public static void main(String[] args){
        doPrint2(5);
    }

    //全排列打印
    public static void doPrint2(int length){
        int[] numbers = new int[length];
        for(int i = 0; i < 10; i++){
            numbers[0] = i;
            PrintToMaxOfNDigits(numbers, length, 0);
        }
    }

    private static void PrintToMaxOfNDigits(int[] numbers, int length, int index) {

        if(index == length - 1){
            doPrint(numbers);
            return;
        }
        for(int i = 0;i < 10;i++){
            numbers[index + 1] = i;
            PrintToMaxOfNDigits(numbers, length, index + 1);
        }
    }

   private static void doPrint(int[] numbers) {
        int i = 0;
        while( i < numbers.length && numbers[i] == 0 ){
            i++;
        }
        for(; i<numbers.length; i++){
            System.out.print(numbers[i]);
        }
        System.out.println();
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章