题目描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,
则打印出 1、2、3 一直到最大的 3 位数 999。
示例 :
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
解法:全排列
考察点:
大数问题。当n足够大时,会超过int甚至long的最大值,此时用整型来表达大数会出现越界问题,
因此采用字符串或字符数组来表达大数。本题解使用字符数组来表达大数。
思路:
如果我们在数字前面补0,就会发现n为所有十进制数其实就是n个从0到9的全排列。也就是说,我们把数字的每一位都从0到9排列一遍,就得到了所有的十进制数。但是为了符合大多数人的阅读习惯,排在的前面的0不打印出来,所以我们通过限制首位的数字,来保证数字不是以0开头。
代码
class Solution17 {
public void printNumbers(int n) {
for (int digit = 1; digit < n + 1; digit++) {
for (char first = '1'; first <= '9'; first++) {
char[] num = new char[digit];
num[0] = first;
dfs(1, num, digit);
}
}
}
private void dfs(int index, char[] num, int digit) {
if (index == digit) {
System.out.println(Integer.parseInt(String.valueOf(num)));
return;
}
for (char i = '0'; i <= '9'; i++) {
num[index] = i;
dfs(index + 1, num, digit);
}
}
}
复杂度分析
时间复杂度:O(10^n)
空间复杂度:不算返回值的话是O(n),数组的最大长度是n,递归的最大深度也是n;算返回值的话是O(10^n)。