class Solution {
public int[] printNumbers(int n) {
int m = (int)Math.pow(10, n);
int[] res = new int[m - 1];
for(int i = 0; i < m - 1; i++){
res[i] = i + 1;
}
return res;
}
}
解题思路:
一个数的首位肯定不会是0, 所以先确定首位数字, 再确定其他位的数字, 所以需要两个for
循环
first
表示首位数字
digit
表示数字的位数
创建一个数组num
更能直观的表示digit
数组的第一个位置就是这个数的首位, 即num[0] = first
, 以此类推, 数组的最后一个位置就是这个数的个位数字
如果index == digit
, 说明这个数字的位数上的各个情况都已遍历完毕, 直接返回即可
如果index != digit
, 开始遍历每个位数上的情况, 直到index == digit
不出意外的话, 这个题考的是大数全排列这种解题思路
超出int
表示范围所以用字符串数组保存
但是题意要求返回int
类型
所以浅转换一下Integer.parseInt(String.valueOf(num))
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++){
for(char first = '1'; first <= '9'; first++){
char[] num = new char[digit];
num[0] = first;
//由于首位数字已确定
//所以从第二位开始
dfs(1, num, digit);
}
}
return res;
}
public void dfs(int index, char[] num, int digit){
if(index == digit){
res[count++] = Integer.parseInt(String.valueOf(num));
return;
}
for(char i = '0'; i <= '9'; i++){
num[index] = i;
dfs(index + 1, num, digit);
}
}
}