https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/submissions/
注意大数的时候——使用数组存储数字
class Solution {
public:
int maxnum(int n){
int max=10;
int count=1;//表示位数
while(count<n){
count++;
max*=10;
}
return max-1;
}
vector<int> printNumbers(int n) {
//返回最大值
//int MaxNum=maxnum(n);
int MaxNum=pow(10,n)-1;
//打印
vector<int> nums;
for(int i=1;i<=MaxNum;i++)
nums.push_back(i);
return nums;
}
};
改进:利用指数函数计算,自己的数学想法没到位
剑指Offer上是要求打印大数的,建议直接抛开提交代码的限制,假定题目的要求为返回 vector。
楼主设定的全局变量有点复杂,代码可读性不高,建议把dfs函数拆开。
个人代码及重点注释如下,辅助函数 dfs(x, len) 的作用是:生成长度为len的数字,正在确定第 x 位。当 x=0 时表示左边第一位,不能为0,这样可以避免出现 0 开头的字符串。
class Solution {
vector<string> res;
string cur;
char NUM[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
// 生成长度为 len 的数字,正在确定第x位(从左往右)
void dfs(int x, int len) {
if(x == len) {
res.push_back(cur);
return;
}
int start = x==0? 1 : 0; // X=0表示左边第一位数字,不能为0
for(int i=start; i<10; i++) {
cur.push_back(NUM[i]); // 确定本位数字
dfs(x+1, len); // 确定下一位数字
cur.pop_back(); // 删除本位数字
}
}
public:
vector<string> printNumbers(int n) {
for(int i=1; i<=n; i++) // 数字长度:1~n
dfs(0, i);
return res;
}
};
当然,为了通过本题,把printNumbers函数改吧改吧就可以提交啦~
我自己写的
class Solution {
public:
//存储大数的数组
vector<string> res;
string cur;//存储中间数字
//数组存储0到9
vector<char> NUM={'0','1','2','3','4','5','6','7','8','9'};
//dfs递归实现对数字位数为len的数字的构造存储到cur中
//x表示当前确定的是哪一位,len表示数字的大小
void dfs(int x,int len){
//递归结束条件,表示已经判构造完毕
if(len==x){
//表示已经构造到最大位数
res.push_back(cur);
return;
}
//起始数字
int count= x==0?1:0;
for(int i=count;i<10;i++){
cur.push_back(NUM[i]);//添加本位数字
//判断下一位
dfs(x+1,len);
cur.pop_back();//删除本位数字,继续下一个数字开始
}
}
vector<int> printNumbers(int n) {
//循环构造所有数字
for(int i=1;i<=n;i++)
dfs(0,i);
vector<int> num;
int size=res.size();
for(int i=0;i<size;i++) num.push_back(stoi(res[i]));
return num;
}
};