题目
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
- 用返回一个整数列表来代替打印
- n 为正整数
解法
解法1:
定义max数组,表示n对应的最大数;根据最大数确定返回的int数组的大小,以及上界。
时间复杂度:O(10^n)
空间复杂度:O(n) 用户返回的空间不算
public int[] printNumbers(int n) {
int[] max = new int[n];
max[0] = 9;
for (int i = 1; i < n; i++) {
max[i] = (int)Math.pow(10,i)*9 + max[i-1];
}
int[] res = new int[max[n-1]];
for (int j = 0; j < max[n-1]; ) {
res[j] =++j;
}
return res;
}
解法2:
改变确定max数据的方式,直接获取最大值。减少空间上的消耗。
时间复杂度:O(10^n)
空间复杂度:O(1) 用户返回的空间不算
public int[] printNumbers(int n) {
int max = (int)Math.pow(10,n);
int[] res = new int[--max];
int i = 0;
while (i < max) {
res[i] = ++i;
}
return res;
}
大数问题
由于本题规定输出的是int类型的数组,所以默认输出的数字都是int范围内,如果没有规定,那么就是一个很经典的大数问题。
关于这个题解,可以优先参考这里。
public class Test7 {
StringBuilder sBuilder = null;
char[] num;
char[] loop = {'0','1','2','3','4','5','6','7','8','9'};
int start, count, nine;
public String printNumbers(int n) {
sBuilder = new StringBuilder();
num = new char[n];
start = n-1;
dfs(0, n);
sBuilder.deleteCharAt(sBuilder.length()-1);
return sBuilder.toString();
}
void dfs(int x, int n) {
if (x == n) {
String str = String.valueOf(num).substring(start);
if (!str.equals("0")) sBuilder.append(str + ",");
if (n-start == nine) {
start--;
}
return ;
}
for (char temp : loop) {
if (temp == '9') nine++;
num[x] = temp;
dfs(x+1, n);
}
nine--;
}
}