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

把字符串转换成整数

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;
    }
};
全部评论

相关推荐

来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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