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

题目描述

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

输入输出

1
2
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]

基本思路

词穷 直接看网站和代码解析😢

java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 没有考虑大数问题 时间复杂度 O(10^n)
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;
}
}

// 考虑大数问题
class Solution {
int[] res;
int count = 0;

public int[] printNumbers(int n) {
res = new int[(int)Math.pow(10, n) - 1];
for(int digit = 1; digit < n + 1; digit++){
//用digit表示要生成的数字的位数,本题要从1位数一直生成到n位数,对每种数字的位数都生成一下首位,所以有个双重for循环
for(char first = '1'; first <= '9'; first++){
//为了避免数字开头出现0,先把首位first固定,first取值范围为1~9
//生成首位之后进入递归生成剩下的digit - 1位数,从0~9中取值
char[] num = new char[digit];
num[0] = first;
dfs(1, num, digit);
}
}
return res;
}

private void dfs(int index, char[] num, int digit){
if(index == digit){
//递归的中止条件为已经生成了digit位的数字,即index == digit,将此时的数num转为int加到结果res中
res[count++] = Integer.parseInt(String.valueOf(num));
return;
}
for(char i = '0'; i <= '9'; i++){
num[index] = i;
dfs(index + 1, num, digit);
}
}
}