方法1:
先计算n位数最大数字,创建数组,用循环加入数值。
public static int[] printNumbers(int n) {
int max = (int ) Math.pow(10, n) - 1;
int[] nums = new int[max];
for (int i = 1; i < max; i++) {
nums[i - 1] = i;
}
return nums;
}
求最大数:
int max = 0;
for (int i = 0; i < n; i++) {
max += (Math.pow(10, i)) * 9;
}
int max = (int ) Math.pow(10, n) - 1;
方法1仅限于小数打印情况。
方法二:
用字符串存储大数,因为要输出全部的数,用分而治之的思想,从高位开始由0~9以此赋值,接着对每一个十位赋好值的个位进行赋值,当位数和所需相同,将该数字加入到字符串即可。
StringBuffer res;
char[] num;
char[] loop = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
int n;
public String printNumbers(int n) {
this.n = n;
res = new StringBuffer();
num = new char[n];
build(0);
res.deleteCharAt(res.length() - 1);
return res.toString();
}
void build(int x) {
if (x == n) {
res.append(num).append(',');
return;
}
for (char sNum : loop) {
num[x] = sNum;
build(x + 1);
}
}
这样输出的数都是预先申请好3位位置,会导致最后输出有0需要删除,如:
1会表示为001。
就需要对高位0进行删除。
利用substring进行除0,到每次放进一个9时,除0边界需要减少一位。
规定两个值,start标记除零边界,nine用于记录加入9的个数。
边界左移的条件:总数位-左边界=九个数
注意在回溯前要把9的个树-1.
StringBuffer res;
char[] num;
char[] loop = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
int n;
int nine;
int start;
public String printNumbers(int n) {
this.n = n;
nine = 0;
start = n - 1;
res = new StringBuffer();
num = new char[n];
build(0);
res.deleteCharAt(res.length() - 1);
return res.toString();
}
void build(int x) {
if (x == n) {
String fNum = String.valueOf(num).substring(start);
if (!fNum.equals('0')) {
res.append(fNum).append(',');
}
if (n - start == nine) {
start--;
}
return;
}
for (char sNum : loop) {
if (sNum == '9') {
nine++;
}
num[x] = sNum;
build(x + 1);
}
nine--;
}