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)中的start 9的个数nine 2 09 1 1 1 3 009 1 2 1 3 099 2 1 2 失去论断:
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