题目难度:较难
题目考察:字符串转换
题目内容:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为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;
    }
};