leetcode-个人题解8

LEETCODE专题


8. String to Integer (atoi)

题目要求:
这里写图片描述


这里其实就是将atoi函数自己实现一遍。
这道题同学在完成的时候用了stringstream,用的代码规模很小,基本上就是几个读写和判断就搞定了。然而时间稍微有点长。。。花了将近32ms的时间。我在完成这道题的时候全程没有用到stringstream,坚持用string的数组操作来一个字符一个字符的检查,这样虽然代码规模比较大,写起来判断也稍微多了点,但是效率高了很多,只花了10ms。

  • 这里就简单说一下用到的几个判断:
    • 输入字符的判断:是否是符号’+’、’-‘,是否是字母(其实后来想想应该是没有必要的,可以删去),是否是数字
    • 输出数字溢出的判断:正数是否大于最大正数,负数是否小于最小负数(因为最大的正数和最小的负数绝对值不一样,所以我选择分开比较

接下来直接上code:

class Solution {
public:
    bool isDigit(char a) {
        return a >= '0' && a <= '9';
    }

    bool isLetter(char a) {
        return (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z');
    }

    bool isSign(char a) {
        return a == '+' || a == '-';
    }

    bool isValid(char a) {
        return isDigit(a) || isLetter(a) || isSign(a);
    }

    int myAtoi(string str) {
        // get the index of the first char except ' '
        int index = 0;
        string result;
        while (index < str.length() && str[index] == ' ') index++;
        if (index == str.length() ) return 0;
        while (index < str.length() && isValid(str[index]) ) {
            if (isLetter(str[index]) ) {
                break;
            } else if (isSign(str[index]) ) {
                if (result.size() > 0) {
                    break;
                } else {
                    if (isSign(result[result.length() - 1]) ) {
                        return 0;
                    } else {
                        result += str[index++];
                    }
                }
            } else {
                result += str[index++];
            }
        }

        if (result.length() == 0) return 0;

        /* if the sum is out of range,
         * set it to be INT_MAX OR INT_MIN
         */
        int sum = 0;
        if (isSign(result[0])) {
            index = 1;
        } else {
            index = 0;
        }
        while (index < result.length() ) {
            if (result[0] != '-') {
                if (sum > (INT_MAX - (result[index] - '0') ) / 10) {
                    return INT_MAX;
                } else {
                    sum = sum * 10 + (result[index++] - '0');
                }
            } else if (result[0] == '-') {
                if (sum < (INT_MIN + (result[index] - '0') ) / 10) {
                    return INT_MIN;
                } else {
                    sum = sum * 10 - (result[index++] - '0');
                }
            }
        }
        return sum;
    }
};

时间复杂度:O(n)

猜你喜欢

转载自blog.csdn.net/m0_37576233/article/details/78070642