8. String to Integer (atoi)


做题历程:

  1. 2016/Oct/19,本题做了不止2次,本次大概耗时20分钟独立解出

本题难倒是不难,就是很坑爹,需要处理的corner case太多了,几乎不可能一次考虑全,大致总结下需要考虑的corner case吧:

  1. +-号,这个是最基础的
  2. 诡异字符,直接跳出
  3. 过大/过小的数: 在 * 10之前要判断跟INT_MAX / 10的大小关系

代码如下:

class Solution {
public:
    int myAtoi(string str) {
        int i = 0;
        bool positive = true;
        while (i < str.length()) {
              if (str[i] == ' ') {
                  ++i;
                  continue;
              }
              if (str[i] == '-') {
                  positive = false;
                  ++i;
                  break;
              }
              else if (str[i] == '+') {
                  ++i;
                  break;
              }
              if (isdigit(str[i])) {
                  break;
              }
              else {
                  return 0;
              }
              ++i;
        }
        int num = 0;
        while (i < str.length()) {
            if (isdigit(str[i])) {
                if (num == INT_MAX / 10) {
                    if (positive && str[i] > '7') {
                        return INT_MAX;
                    }
                    else if (!positive && str[i] > '8') {
                        return INT_MIN;
                    }
                }
                else if (num > INT_MAX / 10) {
                    return positive ? INT_MAX : INT_MIN;
                }
                num = num * 10 + (str[i] - '0');
                ++i;
            }
            else {
                break;
            }
        }
        return positive ? num : -num;
    }
};

results matching ""

    No results matching ""