ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode 剑指offer 17. 打印从1到最大的n位数

2020-04-02 15:58:44  阅读:222  来源: 互联网

标签:isBegin0 17 offer int 打印 number nSum leetcode 进位


输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
 
说明:
用返回一个整数列表来代替打印
n 为正整数

针对于大数的解法
lc上一个人写的。。。属实有点不好懂
 

class Solution {
public:
    vector<int> res;
    vector<int> printNumbers(int n) {
        if (n <= 0) return res;
        //创建一个能容纳最大值的字符数组,由于有一位要存储'\0',因此要开大一格
        char* number = new char[n + 1];
        //初始全部设置为0
        memset(number, '0', n);
        number[n] = '\0';//第n位设为'\0'
        while (!Increment(number)){
            PrintNumber(number);
        }
        delete[]number;//注意要释放内存
        return res;
    }
    bool Increment(char* number) {//形参传递char*指针
        bool isOverflow = false;//检测是否越界
        int nTakeOver = 0;//存储进位
        int nLength = strlen(number);//长度为n,不是n+1
        for (int i = nLength - 1; i >= 0; i--){
            int nSum = number[i] - '0' + nTakeOver;
            if (i == nLength - 1){
                //如果是第一位,进位
                nSum++;
            }
            if (nSum >= 10){
                //有进位
                if (i == 0){
                    //如果是最高位有进位,说明超过了给定得到最大值,越界
                    isOverflow = true;
                }
                else{
                    //非最高位有进位
                    nTakeOver = 1;
                    number[i] = nSum - 10 + '0';//对第i位进行设置
                }
            }
            else{
                //没有进位
                //设置第i位数字
                //并直接跳出循环
                number[i] = nSum + '0';
                break;
            }
        }
        return isOverflow;
    }
    void PrintNumber(char* number){
    //形参传递char*指针,此处改变形参number指向的位置,不会使原始的number指针所指位置改变

        string s = "";
        bool isBegin0 = true;
        while (*number != '\0'){
            if (isBegin0 && *number != '0') isBegin0 = false;
            //碰到'0',则不输出
            if (!isBegin0){
                s += *number;
            }
            number++;
        }
        int num = stoi(s);//转为整数
        res.push_back(num);
    }
};


标签:isBegin0,17,offer,int,打印,number,nSum,leetcode,进位
来源: https://www.cnblogs.com/islch/p/12620383.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有