美文网首页
8. String to Integer (atoi)

8. String to Integer (atoi)

作者: gpfworld | 来源:发表于2018-11-29 10:21 被阅读0次

题目描述:

https://leetcode.com/problems/string-to-integer-atoi/

解决方法:

    int sign = 1, base = 0, i = 0;
    while (str[i] == ' ') { i++; }
    if (str[i] == '-' || str[i] == '+') {
        sign = 1 - 2 * (str[i++] == '-'); 
    }
    while (str[i] >= '0' && str[i] <= '9') {
        if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
            if (sign == 1) return INT_MAX;
            else return INT_MIN;
        }
        base  = 10 * base + (str[i++] - '0');
    }
    return base * sign;
}

mycode(c++):

class Solution {
public:
    int myAtoi(string str) {
        int ret = 0;
        int flag = 0;
        int i = 0;
        int j = str.length()-1;
        while(i < str.length() && str.at(i)==' ')
            i++;
        while(j >=0 && (str.at(j)<'0' || str.at(j)>'9'))
            j--;
        if(i==str.length() || j== -1 )
            return 0;
        if(str.at(i)=='+'){
            flag = 1;
            i++;
        }
        else if( str.at(i)=='-'){
            flag = -1;
            i++;
        }
        else if (str.at(i) >= '0' && str.at(i) <= '9'){
            flag = 1;
        }
        else{
            return 0;
        }
        for(;i<=j;i++){
            if(str.at(i) >= '0' && str.at(i) <= '9'){
                if (flag ==1 && (ret > INT32_MAX/10 || (ret ==INT32_MAX/10 && str.at(i)-48 > 7))) return INT32_MAX;
                if (flag ==-1 && (ret*flag < INT32_MIN/10 || (ret*flag ==INT32_MIN/10 && flag*(str.at(i)-48) < -8))) return INT32_MIN;
                ret = ret * 10 + (str.at(i)-48);
            }
            else
                return ret*flag;
        }
        return ret*flag;
    }
};

心得:

1、不知道字符的asii表的时候,可以直接用相应的字符代码
比如得到'0'的ascii码,就用'0'-'0',str[i]-'0',就可以得到其数值。
2、得到正负号的时候,可以稍微用点儿技巧,节省判断
3、判断溢出的时候,因为正数负数极限值就差1,而且要求返回最大值,所以可以刚好只判断正书溢出即可
4、而且其实根本不需要处理后续的非数字字符,直接是从前往后处理,发现非数字字符时,就会退出。不需要从后往前处理,使用while循环

相关文章

网友评论

      本文标题:8. String to Integer (atoi)

      本文链接:https://www.haomeiwen.com/subject/rbjxcqtx.html