面试题十七:打印从1到最大的n位数

 

输入数字n,按顺序打印到最大的n位数

注意:没有规定类型,无论int或long 都会有可能溢出。
应当选择其他类型如String
方法一:定义长度与位数相同的字符数组,从0开始进行加一操作打印

  public static void f1(int n) {
                  char [] array=new char[n];
                  for(int i=0;i<array.length;i++) {
                       array[i]='0';
                  }
                  int k=0;
                  while(true) {
                       k=1;
                       for(int i=0;i<array.length;i++) {
                             if(array[i]!='9') {k=0;break;}                
                       }
                       PrintNum(array);
                       if(k==1)
                             return ;
                       array=addOne(array);
                  }    
             }
              //打印字符串,因为前面0不打印   
             public static void PrintNum(char []ch) {  
                  int k=1;
                  for(int i=0;i<ch.length;i++) {             
                       if(ch[i]>='1'||k==0) {
                             System.out.print(ch[i]);
                             k=0;                          
                       }
                  }
                  if(k==0)
                      System.out.println();
             }

             public static char[] addOne(char [] ch) //字符串的加一操作 
            { ch[ch.length-1]++;
                  for(int i=ch.length-1;i>0;i--) {
                       if(ch[i]<='9') break;
                        ch[i]='0';
                        ch[i-1]++;              
                  }
                  return ch;
             }

 方法二:全排列

 static void f2(int n){
        if(n<=0) return ;
        char [] array=new char[n];
        for(int i=0;i<10;++i){
            array[0]= (char) (i+'0');
            Recur( array,1);
        }
    }
    static void  Recur(char[] array, int index){
        if( index==array.length) {  PrintNum( array ); return ;}

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

            array[index]= (char) (i+'0');
            Recur( array,index+1);
        }
    }
    static void PrintNum(char []ch) {
        int k=1;
        for(int i=0;i<ch.length;i++) {
            if(ch[i]>='1'||k==0) {
                System.out.print(ch[i]);
                k=0;
            }
        }
        if(k==0)
            System.out.println();
    }

 

 

 在java本机测试中方法一在9以内比方法二慢,9以上比方法二快许多

 

posted @ 2020-03-29 14:36  浪波激泥  阅读(228)  评论(0编辑  收藏  举报