剑指Offer17:打印从1到最大的n位整数

例如:n = 3,打印从 1 ,2,3......999这么多的整数.

思路:介绍最主要的思路,主要是对边界问题的处理,当n<=0return结束。其次就是1,2,3,前面不能带有001,002,必须处理一下当char[i]!='0'即可输出。

for(int i=0;i<nlen;i++){

    if(isPrint0&&len[i]!='0'){

        isPrint0 = false;
    }
    if(!isPrint0){

        System.out.printf("%c",len[i]);
    }

其次就是递归的方法打印这么多数字.

首先明白问题的解空间。即打印001,002....从i=0开始到i=9,即递归的起始就是来个for()嵌套递归。递归方法里

1.边界条件

if(index==n-1){
    PrintNumber(news);
    return;
}

2.不断递归的下一步的情况,因为每一次都需要从0-9位置,即再来for循环,

for(int i=0;i<10;++i){

    news[index+1] = (char) (i+'0');
    PrintToMaxOfNDiGitsRe(news,n,index+1);
}

这里每次到了边界就会return,那么下一次就是从001,..002...003..个位那层进行for循环递增。当个进行递增的时候,个位全部完了,就会到10位。

代码:

 void  PrintNumber(char[] len){

            boolean isPrint0 = true;


            int nlen = len.length;

            for(int i=0;i<nlen;i++){

                if(isPrint0&&len[i]!='0'){

                    isPrint0 = false;
                }
                if(!isPrint0){

                    System.out.printf("%c",len[i]);
                }

            }
            System.out.print("\t");
    }

    //第二种方法

    void PrintToMax(int n){

        if(n<=0){

            return;
        }

        char[] news= new char[n+1];

        for(int i=0;i<10;i++){

            news[0] = (char) (i+'0');
            PrintToMaxOfNDiGitsRe(news,n,0);
        }

    }

    void PrintToMaxOfNDiGitsRe(char[] news,int n,int index){

        if(index==n-1){
            PrintNumber(news);
            return;
        }

        for(int i=0;i<10;++i){

            news[index+1] = (char) (i+'0');
            PrintToMaxOfNDiGitsRe(news,n,index+1);
        }

    }



    public static void main(String[] args) {

        new PrintToMax().PrintToMax(3);

    }

猜你喜欢

转载自blog.csdn.net/weixin_39137699/article/details/89418029