17. 打印从1到最大的n位数

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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值