zoukankan      html  css  js  c++  java
  • leetcode 剑指offer 17. 打印从1到最大的n位数

    输入数字 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;
            //创建一个能容纳最大值的字符数组,由于有一位要存储'',因此要开大一格
            char* number = new char[n + 1];
            //初始全部设置为0
            memset(number, '0', n);
            number[n] = '';//第n位设为''
            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 != ''){
                if (isBegin0 && *number != '0') isBegin0 = false;
                //碰到'0',则不输出
                if (!isBegin0){
                    s += *number;
                }
                number++;
            }
            int num = stoi(s);//转为整数
            res.push_back(num);
        }
    };
    
    
    












    种一棵树最好的时间是十年前,其次是现在。
  • 相关阅读:
    装饰器函数(一)
    面向对象的初阶复习
    内置函数/反射/内置方法(单例类面)
    property特殊属性/类方法/静态方法
    多态/封装
    接口类抽象类
    初始继承之顺序/深度优先及广度优先
    类涉及的空间关系及组合(可变项地址面)
    <head></head>
    让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
  • 原文地址:https://www.cnblogs.com/islch/p/12620383.html
Copyright © 2011-2022 走看看