Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode>打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
用返回一个整数列表来代替打印
n 为正整数
二、思路分析:
思路一:
- 大体思路:一般的普通解法,这题考查的实际是大数问题
- 枚举
思路二:
- 大体思路:全排列解法
- 在数字很大的情况下,哪怕long类型也无法承载,那必须要用字符串保存。
- 本题其实是对数字0
9的全排列,从1位数09的全排列到n位数0~9的全排列,其中要注意的是数字开头不应该有0。 - 为了避免数字开头出现0,先把首位first固定,first取值范围为1~9
- 用digit表示要生成的数字的位数,本题要从1位数一直生成到n位数,对每种数字的位数都生成一下首位,所以有个双重for循环
- 生成首位之后进入递归生成剩下的digit - 1位数,从0~9中取值
- 递归的中止条件为已经生成了digit位的数字,即index == digit,将此时的数num转为int加到结果result中
三、AC 代码:
思路一:
class Solution {
public int[] printNumbers(int n) {
int[] result = new int[(int) Math.pow(10, n) - 1];
for (int i = 0; i < result.length; i++) {
result[i] = i + 1;
}
return result;
}
}
思路二:
class Solution {
int[] result;
int count = 0;
public int[] printNumbers(int n) {
result = new int[(int) Math.pow(10, n) - 1];
for (int digit = 1; digit < n + 1; digit++) {
for (char first = '1'; first <= '9'; first++) {
char[] number = new char[digit];
number[0] = first;
dfs(1, number, digit);
}
}
return result;
}
private void dfs(int index, char[] num, int digit) {
if (index == digit) {
result[count++] = Integer.parseInt(String.valueOf(num));
return;
}
for (char i = '0'; i <= '9'; i++) {
num[index] = i;
dfs(index + 1, num, digit);
}
}
}
四、总结:
全排列简单说明:
比如对于数字1,2,3的全排列是:
123, 132, 213, 231, 312, 321
为了能够测试通过,最后把字符串形式变成了int形式,其实应该返回字符串数组