剑指offer17 依次打印从1到最大的n位数

这是一道不错的题。可惜牛客网上没有找到。

依次打印,又存在大数问题,所以问题分为两部分:解决大数的表示和加1,解决大数的打印(前置0)。

代码见剑指offerp117附近。

但是这样代码量其实是比较大的。

所以还有思路二:

对每个数位递归调用,每位都是0~9。

代码大概如下。

class Solution{
    public void print1ToMaxofNDigits(int n){
        if(n<1) return;

        int[] nums2print = new int[n];
        int index = 0;
        for(int i=0;i<10;i++){
            nums2print[0]=i;
            printRecursively(n,0,nums2print);
        }
    }  
    private void printRecursively(int n,int index,int[] nums2print){
        if(index==n-1) {printNum(nums2print);return;}
 
        for(int i=0;i<10;i++){
            nums2print[index+1]=i;
            printRecursively(n,index+1,nums2print);
        }
    }     
    private void printNum(int[] nums2print){
        boolean isBegin = false;
        for(int i=0;i<nums2print.length;i++){
            if(nums2print[i]!=0&&!isBegin) isBegin=true;
            if(isBegin){
               System.out.printf("%d",nums2print[i]);
            }
        }
    }
}

 当然用java.math.BigInteger和java.math.BigDecimal也是可以的,不过肯定不符合面试要求而且肯定会问这俩类内部是咋实现的/笑哭,所以不如乖乖用string转换。

posted @ 2019-02-22 10:59  大胖子球花  阅读(144)  评论(0)    收藏  举报