1. 题目
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
用返回一个整数列表来代替打印
n 为正整数
(1)for循环:
class Solution {
public int[] printNumbers(int n) {
int end = (int)Math.pow(10, n) - 1;
int[] res = new int[end];
for(int i =0; i < end; i++){
res[i] = i+1;
}
return res;
}
}
(2)考虑大数
可以看看这篇题解:考虑大数.
大数越界情况下的打印。需要解决以下三个问题:
class Solution{
char[] digits = new char[]{'0','1','2','3','4','5','6','7','8','9'};
char[] num;
int n;
StringBuilder res = new StringBuilder();
private String printNumbers(int n){
this.n = n;
num = new char[n];
dfs(0);
res.deleteCharAt(res.length() - 1);
return res.toString();
}
//选择第x位上的数字(从0-9当中挑选一个)
private void dfs(int x){
if(x == n){
StringBuilder numStr = new StringBuilder(String.valueOf(num));
//去除所有前置的0
boolean nonZero = false;
for(int i = 0; i < numStr.length(); i++){
if(numStr.charAt(i) != '0') nonZero = true;
if(!nonZero && numStr.charAt(i) == '0'){
numStr.deleteCharAt(i);
//每次删除一个字符,后边的所有字符就会前移一位,所以删除的指针也要前移一位,否则会漏掉该删除的‘0’没有删
i--;
}
}
//从1开始打印,所以排除掉“000”(经过删除后变为空串“”)的情况
if(!numStr.toString().equals("")) res.append(numStr.toString()).append(",");
return;
}
for(int i = 0; i < 10; i++){
num[x] = digits[i];
dfs(x + 1);
}
}
}