题解 | 打印从1到最大的n位数

打印从1到最大的n位数

https://www.nowcoder.com/practice/4436c93e568c48f6b28ff436173b997f

#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型 最大位数
     * @return int整型vector
     */

    bool Increment(std::string& number) { // &,要修改
        bool isOverflow = false;
        int carry = 1;
        for (int i = number.length() - 1; i >= 0; --i) {
            int sum = (int)(number[i] - '0') + carry;
            if (sum >= 10) {
                if (i == 0)
                    isOverflow = true;
                else {
                    sum -= 10;
                    number[i] = '0' + sum;
                }
            } else {
                // 没有进位就直接退出,前面的保持不变
                number[i] = '0' + sum;
                break;
            }
        }
        return isOverflow;
    }

    int PrintNumber(const std::string& number){
        if(number.empty()) return 0;
        bool firstZero = true;
        int ans = 0;
        for(int i = 0; i < number.size(); ++i){
            if(firstZero&&number[i]=='0')   continue;
            else{
                firstZero = false;
                ans = std::stoi(number.substr(i));
                break;
            }
        }
        return ans;
    }
    vector<int> printNumbers(int n) {
        // write code here
        vector<int> res;
        if (n <= 0)
            return res; // 说明输入错误了,我们可以throw一个异常或者全局变量
        std::string str(n, '0');
        while (!Increment(str)) {
            res.push_back(PrintNumber(str));
        }
        return res;
    }
};

因为返回是int的vector,所以其实可以不考虑大数问题了。

这里给了一种大数的解法,再转化成int以满足这道题的输出。

大数问题一般通过字符串解决,只让最后一位加,然后依次看进位。

dfs大数做法:

#include <string>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 最大位数
     * @return int整型vector
     */
    
    int my_stoi(string str){
        if(str.empty()) return 0;//错误
        int ans = 0;
        for(int i = 0; i < str.length(); ++i){
            if(str[i]=='0') continue;
            else{
                ans = std::stoi(str.substr(i));
                break;
            }
        }
        return ans;
    }
    void dfs(int n, string& cnt, vector<int>& res){
        if(n==cnt.size()){//最后一个下一个来输出,最后一个还是要遍历0-9的
            int temp = my_stoi(cnt);
            if(temp!=0)//0不要,00之类也不要,但是多0情况我的my_stoi()输出依然是0,所以可以这样判断
                res.push_back(temp);
            return;
        }
        for(int i = 0; i < 10; ++i){
            cnt[n] = '0' + i;
            dfs(n+1, cnt, res);
        }
    }
    vector<int> printNumbers(int n) {
        // write code here
        vector<int> res;
        if(n<=0) return res;//最好throw点什么
        string cnt(n, '0');
        dfs(0, cnt, res);
        return res;
    }
};

对于这道题因为是输出所有值,所以还可以用递归遍历。

dfs要注意stoi不能用于空字符串。

全部评论

相关推荐

一天代码十万三:这都不能算简历吧
点赞 评论 收藏
分享
群星之怒:1.照片可以换更好一点的,可以适量P图,带一些发型,遮住额头,最好穿的正式一点,可以适当P图。2.内容太少。建议添加的:求职意向(随着投递岗位动态更改);项目经历(内容太少了建议添加一些说明,技术栈:用到了什么技术,还有你是怎么实现的,比如如何确保数据传输稳定的,角色注册用到了什么技术等等。)项目经历是大头,没有实习是硬伤,如果项目经理不突出的话基本很难过简历筛。3.有些内容不必要,比如自我评价,校内实践。如果实践和工作无关千万别写,不如多丰富丰富项目。4.排版建议:建议排版是先基础信息,然后教育背景(要突出和工作相关的课程),然后专业技能(一定要简短,不要长篇大论,写你会什么,会的程度就可以),然后是项目经历(一定要详细,占整个简历一定要超过一半,甚至超过百分之70都可以)。最后如果有一部分空白的话可以填补上校内获得的专业相关的奖项,没有就写点校园经历和自我评价。5.技术一定要够硬,禁得住拷打。还有作息尽量保证正常,不要太焦虑。我24双非本科还是非科班,秋招春招各找了一段实习结果都没有转正,当时都想噶了,最后6月份在校的尾巴也找到一份工作干到现在,找工作有时很看运气的不要急着自我否定。 加油
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务