Question :


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.


Anwser 1 :

class Solution {
public:
    int atoi(const char *str) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        long long ret = 0;
        
        const char *p = str;
        
        while(*p == ' ') p++;
        
        bool valid = true;
        while(valid && *p == '+') {
            valid = false;
            p++;
        }
        
        while(*p == '0') p++;
        
        bool minus = false;
        if(*p == '-'){
            minus = true;
            p++;
        }
        
        while(*p != '/0'){
            if(*p >= '0' && *p <='9'){
                ret = ret * 10 + *p - '0';
                if(!minus && ret > INT_MAX) return INT_MAX; // positive and overflow
                if(minus && -ret < INT_MIN) return INT_MIN; // negative and overflow
                p++;
            } else {        // no digit then break
                break;
            }
        }
        
        return minus ? -ret : ret;
    }
};

注意点:

1) 结果变量 ret 设为了长整形(long long),防止溢出; 最后结果由长整形自动截取为整形(int),返回

2) 计算得到结果时,需要配合正负符号判断是否已经越界,越界溢出后直接返回


Anwser 2 :

class Solution {
 public:
     int atoi(const char *str) {
         // Start typing your C/C++ solution below
         // DO NOT write int main() function
         assert(str != NULL);
         
         while(isspace(*str)) str++;  // remove ' '
             
             
         int sign = (*str == '-') ? -1 : 1;
         
         if (*str == '-' || *str == '+')    // if can check one char
             str++;
             
         int ret = 0;
         while(isdigit(*str))   // is digit
         {
             int digit = *str - '0';
             
             if (INT_MAX / 10 >= ret)
                 ret *= 10;
             else
                 return sign == -1 ? INT_MIN : INT_MAX;
                 
             if (INT_MAX - digit >= ret)
                 ret += digit;
             else
                 return sign == -1 ? INT_MIN : INT_MAX;
                 
             str++;
         }
         
         return ret * sign;
     }
 };

注意点:

1) 结果类型为整形(int),不需要转化,非常好!

2) 对空格(‘ ’)、数字(isdigit)都直接调用函数,非常简洁!

3) 对溢出全部采用减法(-)判断,有效预防了加法运算可能的溢出问题,非常值得借鉴!