【LeetCode】008 String to Integer (atoi)

题目:LeetCode 008 String to Integer

题意:完成内置函数atoi的功能,将字符串转换成整数。

教训:一开始理所应当的随便一写,然后发现有很多的异常情况需要处理。然后按照C++ Reference中关于atoi的规定一条一条写,才AC。另外还有一个溢出的问题,一开始以为int会自动处理直接返回边界值,其实不是,如果溢出的话大于2147483647的数会给变成负数,因此要单独判断是否会大,但是设置成longlong 之后出现的问题是,还有可能会溢出longlong,所以每次对ans进行改变之后都要判断是否在integer的范围之内。

atoi的函数规则:http://www.cplusplus.com/reference/cstdlib/atoi/ 

1、前导空格忽略

2、判断是否是以'+'、'-'为前导来规定整数的正负

3、在整数后面有非数字的字符则忽略返回前面的整数

4、如果无法构成有效整数,即含有其他乱七八糟字符,返回0

5、如果超出整数范围,大于的返回INT_MAX=2147483647,小于的返回INT_MIN=-2147483648.

 

代码如下:

class Solution {
public:
    int myAtoi(string str) {
        int len = str.size(), i = 0, flag = 1;
        const int MAX = 2147483647, MIN = -2147483648;
        long long ans = 0;

        // 可能有前导空格
        while(str[i] == ' ') i++;

        // 可能在前面有表示正负的符号
        if(str[i] == '-')
        {
            flag = -1;
            i++;
        }
        else if(str[i] == '+') i++;

        while(i < len)
        {
            // 保证加起来的字符为有效数字
            if(str[i] <= '9' && str[i] >= '0')
            {
                ans *= 10;
                ans += (str[i++]-'0');
                if(ans*flag > MAX) return MAX;
                if(ans*flag <MIN) return MIN;
            }
            // 可能最后有其他字符
            else break;
        }
        ans *= flag;
        if(ans > MAX) return MAX;
        else if(ans <MIN) return MIN;
        return ans;
    }
};

 

posted @ 2015-04-27 12:57  二喵de喵  阅读(199)  评论(0编辑  收藏  举报