剑指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();
    }

 

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