1.剑指 Offer 17. 打印从1到最大的n位数
思路:最大的一位数是9,最大的两位数是99,因此可以推导出end = 10的n次方减一,步长为1做循环即可。
代码:
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;
}
}
全排列解法:
在考虑数字很大的情况下,必须要用字符串保存。相当于对数字0-9的全排列,从一位数0-9的全排列到n位数0-9的全排列,注意开头的数字不能为0。
- 为了避免开头为0,首先把第一位固定,取值为1-9
- 用digit表示要生成的位数,从1一直到n,每种数字的位数都生成下一位首位,双重for循环
- 生成首位之后进入递归生成剩下的digit-1位数,从0-9取值
- 终止条件为已经生成了digit位数字,即index==digit,将此时的num转化为int加到结果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++){
for(char first = '1';first<='9';first++){
char[] num = new