Categories
不学无术

LeetCode 8. String to Integer (atoi)

题目

Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
Update (2015-02-10):
The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.

思路

这道题没什么思路,但是要主要一定要在溢出之前解决溢出!不同的编译器对溢出的处理方法不一样的,所以得到的溢出结果也是不同的,比如int的正整数溢出就是负整数什么的就肯定不对。我的想法是用unsigned int把可能溢出的情况兜住判断,可能溢出的情况无非两个,乘以10的时候,加一个个位数的时候。

代码

class Solution {
public:
    bool willOverflow(unsigned int currNum, char i, bool negFlag){
        const unsigned int M_INTM = INT_MAX / 10;
        if(currNum > M_INTM){
            return true;
        } else if(currNum == M_INTM){
            if(!negFlag){
                if(i - '0' > 7) {
                    return true;
                }
            } else{
                if(i - '0' > 8){
                    return true;
                }
            }
        }
        return false;
    }
    int myAtoi(string str) {
        unsigned int retVal = 0;
        bool negFlag = false;
        bool overflow = false;
        if(str.size() < 1)
            return 0;
        int i=0;
        while(str[i] == ' '){
            i++;
        }
        if(str[i] == '+')
            i++;
        else if(str[i] == '-'){
            i++;
            negFlag = true;
        }
        int digCount = 0;
        while(i < str.size() && str[i] >= '0' && str[i] <= '9'){
            if(digCount < 9 || !willOverflow(retVal, str[i], negFlag)){
                retVal = retVal * 10 + str[i] - '0';
            } else {
                //overflow!
                overflow = true;
                break;
            }
            i++;
            digCount++;
        }
        if(!overflow){
            if(negFlag)
                return -retVal;
            else
                return retVal;
        } else {
            return negFlag? INT_MIN: INT_MAX;
        }
    }
};

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.