class Solution {
int[] res;
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 = new char[n];
start = n - 1;
dfs(0);
return res;
}
void dfs(int x) {
if(x == n) {
String s = String.valueOf(num).substring(start);
if(!s.equals("0")) res[count++] = Integer.parseInt(s);
if(n - start == nine) start--;
return;
}
for(char i : loop) {
if(i == '9') nine++;
num[x] = i;
dfs(x + 1);
}
nine--;
}
}
作者:jyd
链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/solution/mian-shi-ti-17-da-yin-cong-1-dao-zui-da-de-n-wei-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
自己参考书上写的C++版本:
class Solution {
public:
vector<int> printNumbers(int n) {
// 全排列 数据结构 算法分析 ACM 结合实践刷题
vector<int> numbers;
if(n<0) return numbers;
vector<char> temp(n);
vector<string> temps; //为了输出整数,但是不能进行大数的计算,主要是前面题解提出的溢出问题,
// temp[n] ='\0';
for(int i=0;i<10;i++){
char tmp = i + '0';
temp[0]= tmp;
DigitsRec(temp,n,0,temps);
}
// 将temp转换成数字
for(int r =0;r<temps.size();r++){
// 将temps[j] 转换成int
int inttmp = atoi(temps[r].c_str());
// int tmp1 = (int)(temps[j]);
//cout<<"inttmp="<<inttmp<<endl;
if(inttmp!=0)
numbers.push_back(inttmp);
}
return numbers;
}
void DigitsRec(vector<char> temp, int n, int index, vector<string>& temps){
if(index==n-1){
string tmp2;
bool isBegin = true;
for(int k=0;k<temp.size();k++){
if(isBegin && temp[k]!='0')
isBegin = false;
if(!isBegin) tmp2 += temp[k];
//cout<<"temp[k]="<<temp[k]<<endl;
}
// cout<<"tmp2="<<tmp2<<endl;
temps.push_back(tmp2);
return;
}
for(int j=0;j<10;j++){
char tmp1 = j + '0';
temp[index+1] = tmp1;
DigitsRec(temp,n,index+1,temps);
}
}
};
/*效果比较垃圾,需要优化代码,等写完了回来更新!*/