输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
思路:不考虑大数问题就直接创建一个长度为pow(10,n)-1的递增数组就完事了。
public int[] printNumbers(int n) {
int len = (int)(Math.pow(10,n) - 1);
int[] arr = new int[len];
for(int i = 0;i < len; i++){
arr[i] = i + 1;
}
return arr;
}
考虑大数问题的话,方法返回值为1~pow(10,n)-1的字符串。先固定高位的0-9的值,再固定低位0-9的值,因此直接使用递归可以遍历出1~pow(10,n)-1。
int n;
StringBuilder res; //数字的全排列
StringBuilder num; //拼接的单个数字
char[] ch = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; //0-9字符数组
public String printNumbers(int n) {
this.n = n;
this.res = new StringBuilder();
this.num = new StringBuilder();
dfs(0);
res.deleteCharAt(res.length() - 1); //删除最后位的‘,’
return res.toString();
}
public void dfs(int index){
if(index == n){ // 递归出口,所有位数固定完成
if(num.length() > 0){
res.append(num);
res.append(",");
}
return;
}
for (int i = 0; i < 10; i++){
if(!(res.length() == 0 && i == 0)){ //如果高位不为0才拼接数字
num.append(ch[i]);
}
dfs(index + 1);
if(num.length() > 0){
num.deleteCharAt(num.length() - 1); // 回溯后去掉最后一位数字
}
}
}
参考:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof