https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/solution/fei-zi-jie-ti-ku-jian-17-jian-dan-da-yin-cong-1dao/
这个多看看 讲的还行吧
力扣把他当简单题了 所以应该没有考虑大数问题:(常规解法 面试不能)
class Solution {
public:
vector<int> printNumbers(int n) {
int max=1;
for(int count=1;count<=n;count++){
max=max*10;//最大数
}
vector<int> result;
for(int i=1;i<max;i++){
result.push_back(i);
}
return result;
}
};
递归全排列解法:
假设 n = 3,要输出的数其实就是三位数的全排列(000,001,002,…,999,当然 000 不能输出),我们用递归来表示出这个过程即可。
class Solution {
public:
vector<int> output;
vector<int> printNumbers(int n) {
if(n <= 0) return vector<int>(0);
string s(n, '0');
for(int i=0; i<=9; ++i)
{
s[0] = i + '0';
permutation(s, s.length(), 1);
}
return output;
}
void permutation(string& s, int length, int pos)
{
// 这个函数的执行机制我想了好久才弄明白,mark一下,对带有循环的递归有时候还挺绕的
if(pos == length)
{
inputNumbers(s);
return;
}
for(int i=0; i<=9; ++i)
{
s[pos] = i + '0';
permutation(s, length, pos + 1);
}
}
void inputNumbers(string s)
{
//本函数用于循环往output中添加符合传统阅读习惯的元素。比如001,我们会添加1而不是001。
bool isUnwantedZero = true;
string temp = "";
for(int i=0; i<s.length(); ++i)
{
if(isUnwantedZero && s[i] != '0') isUnwantedZero = false;
if(!isUnwantedZero) temp += s[i];
}
if(temp != "") output.push_back(stoi(temp)); // 如果 s = "000",则temp会是空,stoi无法执行,会报错
}
};
作者:superkakayong
链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/solution/fei-zi-jie-ti-ku-jian-17-jian-dan-da-yin-cong-1dao/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。