题解 | #把字符串转换成整数#

把字符串转换成整数

http://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e

题目难度:较难
题目考察:字符串转换
题目内容:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0

题目分析:首先这题我看到标的是困难就有点奇怪,这应该是一个水题,然后轻松过掉了,发现题解里写了一堆啥越界问题,我去某地方看这道题才发现要考虑各种临界数据。。。
首先先不考虑边界问题,将字符串转换为数字应该怎么转换,若从左向右遍历数字,设当前位字符为c,数字结果为res,则数字拼接公式为:
图片说明
这实际上是容易理解的,这题的难点在于各种边界问题,可以怎么考虑呢,long long !!!,哎这就很方便了,不存在什么边界问题,这题并没有告诉你越界了输出什么。。。如果要输出-1什么的都可以通过判断最终的值来考虑是否越界
下面给出代码
算法1(long long)

class Solution {
public:
    int StrToInt(string str) {
        if(str.size()==0)return 0;
        long long ans=0
        //注意用long long来考虑边界问题
        int k=1;
        //k判断正负号
        if(str[0]=='+')ans=0;
        else if(str[0]=='-')k=-1;
        else ans=str[0]-'0';
        //判断第一个数是数字或者是符号
        for(int i=1;i<str.size();i++) if(str[i]>='0'&&str[i]<='9')
            ans=ans*10+(str[i]-'0');
        else return 0;
        return (int)(ans*k);
        //这里题目如果要考虑越界可以用long long的ans来判断是否越界
    }
};

算法2:
很明显这题的本意是不想让你用long long的而是想考虑细节的处理,这题的细节在于整数的溢出,在什么地方会溢出
1.res10
*
2.**res+str-'0'
也就是说只要判断了这里就能避免溢出情况
下面给出代码

class Solution {
public:
    int strToInt(string str) {
        int i = 0;
        bool sign=false;
        //提取+,-符号。
        if(str[i] == '-'){
            sign=true;
            ++i;
        }else if(str[i] == '+'){
            ++i;
        }
        int ans = 0;
        //提取整数部分。累加过程中,如果正数 > INT_MAX时,返回INT_MAX. 如果负数 < INT_MIN时,返回INT_MIN.
        while(i < str.size() && isdigit(str[i])){
            ans = ans*10 +(str[i] - '0');
            if(!sign && ans > INT_MAX){
                return INT_MAX;
            }else if(sign && -ans < INT_MIN){
                return INT_MIN;
            }
            ++i;
        }

        return sign ? -ans : ans;
    }
};
全部评论

相关推荐

01-28 16:12
中南大学 Java
几年前还没有chatgpt的时候,刷题真的是很痛苦。刷不出来只能看题解,题解有几个问题:第一个是每次看的写题解的人都不一样,很难有一个统一的思路;第二个也是最重要的是,题解只提供了作者自己的思路,但是没有办法告诉你你的思路哪里错了。其实很少有错误的思路,我只是需要被引导到正确的思路上面去。所以传统题解学习起来非常困难,每次做不出来难受,找题解更难受。但是现在chatgpt能做很多!它可以这样帮助你&nbsp;-1.&nbsp;可以直接按照你喜欢的语言生成各种解法的题解和分析复杂度。2.&nbsp;把题和你写的代码都发给它,它可以告诉你&nbsp;你的思路到底哪里有问题。有时候我发现我和题解非常接近,只是有一点点🤏想错了。只要改这一点点就是最优解。信心倍增。3.&nbsp;如果遇到不懂的题解可以一行一行询问为什么要这样写,chatgpt不会嫌你烦。有时候我觉得自己的range写错了,其实那样写也没错,只是chat老师的题解有一点优化,这个它都会讲清楚。4.&nbsp;它可以帮你找可以用同类型解法来做的题。然后它可以保持解法思路不变,用一个思路爽刷一个类型的题。如果题目之间思路又有变化,它会告诉你只有哪里变了,其他的地方还是老思路。5.&nbsp;它也可以直接帮你总结模板,易错点。经过chat老师的指导,我最大的改变是敢刷题了。之前刷题需要先找某一个人写的算法题repo,然后跟着某一个人他的思路刷他给的几个题。如果想写别的题,套用思路失败了,没有他的题解,也不知道到底哪里错了;看别人的题解,思路又乱了。这个问题在二分查找和dp类型的题里面特别常见。但是现在有chat老师,他会针对我的代码告诉我我哪里想错了,应该怎么做;还按照我写代码的习惯帮我总结了一套属于我的刷题模板。每天写题全是正反馈!
牛客981:不刷才是爽
AI时代的工作 VS 传...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务