17. 打印从1到最大的n位数


留神!需思考大数

思路:

  • n位数须要输入1~10^n-1
  • 当须要思考大数时,用int类型不能蕴含所有状况,因而须要用字符数组的全排列来失去。
  • 两位数须要两层for循环来失去十位和个位的排列组合,n层for循环用递归代替
  • 字符数组转换为int类型:

    字符数组--字符串(String)--int  ----s = String.valueOf(num)----Integer.parseInt(s)
  • 用递归示意多层for:具体

    void def(int n){  if(){     ...     return;  }  for(xxx){      def();在for循环中调用本人  }}
  • 去零。全排列的后果无奈防止地会呈现[001,002,003...]而不是题目所须要的[1,2,3,...,999]

    • 后果中的某一个数的位数和9的个数和n的关系有:
    输出n此时的数此时该数的位数subString(start)中的start9的个数nine
    209111
    3009121
    3099212

    失去论断:

      n  = start + nine

    ,因而在满足以上条件时,须要扩充子字符串的范畴,即start--

    • 计算 nine。是在for里计算的,同时 计算了09,变20时跳出个位的循环,须要nine-1,不能影响前面20的时候,nine应该是0,而不是1。

操作:

public class Solution {    char[] arr = {'0','1','2','3','4','5','6','7','8','9'};    int n;    int[] res;    char[] num;    int nine,start, k =0;    public int[] printNumbers(int n){        this.n = n;        res = new int[(int) Math.pow(10,n)-1];        num = new char[n];        start = n-1;        def(0);        return res;    }    public void def(int x){        if (x == n){            String s = String.valueOf(num).substring(start);            if(s.equals("0")) return;            res[k] = Integer.parseInt(s);            k++;            if (n-start == nine) start--;            return;        }        for (char a :                arr) {            if (a=='9') nine++;            num[x] = a;            def(x+1);        }        nine--;    }}

d25