LeetCode#8 String to Integer (atoi)

今天刷了LeetCode的一道题。这题看上起很简单,但实现起来的逻辑比较复杂。

题目要求:

  1. 输入一个字符序列,在这个序列中寻找第一个不为空格的字符。从这个字符开始,读入一个可选的正负号,然后读入一串数字,将这些字符转换成一个数值。
  2. 字符串中能够包含额外的字符跟在形成数值的字符后面,这些字符需要被忽略并且不影响这个函数的效果。
  3. 如果遇到的第一个不为空格的字符不是一个有效的数字或者并不存在这样的一个字符序列可以转换为数值,则不必进行转换。(因为有可能字符串为空或者字符串只包含空格)。
  4. 如果转换没有进行,则返回零值。如果转换后的数值超过了int的表示范围,则返回int范围的临界值INT_MAX (2147483647)和INT_MIN (-2147483648)。

思路:

  1. C++中的string类型里,存在着find_first_not_of这个函数,它能帮助我们找到第一个不为某个字符的位置。
  2. 找到这个位置后,后面判断是否存在着正负号。用一个标记来表示符号的情况。
  3. 然后对字符串中的数字字符进行处理,直到碰到非数字字符为止,把处理得到的数值储存起来。
  4. 对于没有转换的字符串返回0。对于超出int范围的值应该返回临界值。

代码如下:

class Solution {
public:
    int myAtoi(string str) {
        long result = 0;
        int flag = 1;
        for (int i = 0; i < str.length();) {
                i = str.find_first_not_of(' ');
                if (str[i] == '-' || str[i] == '+')
                    flag = (str[i++] == '-') ? -1 : 1;
                while(str[i] <= '9' && str[i] >= '0') {
                    cout << str[i] << endl;
                    result = result * 10 + (str[i++] - '0');
                    cout << result <<endl;
                    if (result * flag >= INT_MAX)
                        return INT_MAX;
                    if (result * flag <= INT_MIN) 
                        return INT_MIN;
                }
                return result * flag;
        }
        return 0;
    }
};