打印1到最大的n位数:大数问题,全排列实现

题目:
输入数字n,按顺序打印出从1到最大的n位十进制数。比如,输入3,则打印出1,2,3,…..,一直到最大的3位数即999。

剑指offer上的题目,典型的大数加法问题,无论是int还是long 类型都可能会溢出。所以在解决大数问题时,通常是使用字符串或者数组实现其功能。
思考:

  1. 字符串String在这里需要不断做改变,大家都知道String是不可变的,所以每次都需要新建String对象。因此,采用数组方式,字符 int均可;
  2. 剑指offer上代码对全排列表述重复,再次做小修改。
    //最重要递归函数实现全排列
public static void Print_1ToMax_Of_Ndigits(int[] number,
                                   int length,int index)
{
    //检查当前是否 溢出,溢出代表排列已满,即最后一位已经赋值,直接将当前数字number打印即可;
        if(index ==length){
            PrintNumber(number);
            return;
        }
        for(int i=0;i<10;i++){
            number[index]=i;
            PrintMaxOfNdigits(number, length, index+1);
        }
        System.out.println("");//最高位变一次,输出一次空行
    }


    //打印字符数组number
 public static void PrintNumber(int[] number){  
        boolean isBeginning0=true;
        for(int i=0;iif(isBeginning0&&number[i]!=0)
                isBeginning0=false;
            if(!isBeginning0){//从第一个非0数字打印
                System.out.print(number[i]);
            }
        }
        System.out.print("\t");//一个数字输出完毕
    }
 public static void PrintNumber(int n){
        if(n<=0)
            return;
        int[] number = new int[n];
        Print_1ToMax_Of_Ndigits(number, n, 0);
    }

全排列,算法中实现时就是在循环中指定第一个数字后,再去for指定第二个,第三个;在这期间需要去判断,指定的位数是否已满,已满则直接将这个拼好的 int[] 输出即可。

你可能感兴趣的:(剑指offer)