目录
打印从1到最大的n位数
描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。
比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1
输入
n = 1
输出
[1,2,3,4,5,6,7,8,9]
说明
用返回一个整数列表来代替打印,n 为正整数
方法一:迭代
这个题思路比较清晰,首先利用确定打印的范围,然后循环赋值即可。
class Solution {
public int[] printNumbers(int n) {
int size=(int)Math.pow(10,n);
int arr[]=new int[size-1];
for (int i = 1; i < size; i++) {
arr[i-1]=i;
}
return arr;
}
}
方法二:大数解法
题目中没有考虑大数,但是鉴于面试题不会这么简单,所以我们将大数因素考虑进来重新实现。
如果的值超出了int或者long所表示的范围,那么我们就需要考虑大数越界的打印情况。
我们用String类型来存储大数,使用全排列的方法生成所有数,打印的数就是对n位数据,每一位进行0-9的全排列,首先我们对最高位确定,依次确定低一位的数据,排列完毕。
全排列的方法我们使用深度优先搜索。
class Solution {
private StringBuffer res;
int num;
char[] val,number={'0','1','2','3','4','5','6','7','8','9'};
public String printNumbers(int n) {
num=n;
res=new StringBuffer();
val=new char[n];//创建长度为n的字符数组,存储全排列的数据
dfs(0);
res.deleteCharAt(res.length()-1);//删除最后的逗号
return res.toString();
}
private void dfs(int m) {
if (m==num){
res.append(String.valueOf(val)+",");//将结果添加到res中,用逗号隔开
return;
}
for (char i:number) {
val[m]=i;//将第m位固定为字符i
dfs(m+1);//深度搜索下一位数字的情况
}
}
}