类似全排列题目:
全排列(不重复的数字版+递归回溯)
字符串全排列(重复字符版)
实际考点,返回字符串的打印形式
class Solution {
int[] res;//存放最终的结果
/**
nine:统计每一个n位数中出现9的个数
count:res[]数组中的下标
start:位有效数字的起始位的序号
*/
int nine = 0, count = 0, start, n;
char[] num, loop = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
public int[] printNumbers(int n) {
this.n = n;
res = new int[(int)Math.pow(10, n) - 1];
//num用来存放每次一个n位数的容器
num = new char[n];
//start为初始化的有效位的起始位置
start = n - 1;
dfs(0);
return res;
}
void dfs(int x) {
//每次达到深度为n时,恰好生成一个数(递归终止)
if(x == n) {
//截取有效数位进行存储
String s = String.valueOf(num).substring(start);
if(!s.equals("0")){//不要0,从1开始计数
res[count] = Integer.parseInt(s);
count++;
}
//判断是否需要更新start的起始有效序号的位置
//注意start的调整实际上是按照数的大小进行调整的(例如:n=3时,009--010--099--100),所以将start调整放在存放每个数的时候
if(n - start == nine) {
start--;
}
return;
}
//for循环用来回溯,注意:for循环内不属于小回溯(同层位进行调整遍历),for循环结束实际上是大回溯(向高一位)
//nine需要在每次本位向高位回溯的时候需要调整(本层的for循环结束后--),以及本位本身遇到9是需要调整(for层循环内部++)
for(char i : loop) {
if(i == '9') nine++;
num[x] = i;
dfs(x + 1);
}
nine--;
}
}
substring学习