leetcode——字符串转换整数(atoi)

题目:

实现一个 atoi 函数,使其能将字符串转换成整数。

转换规则:

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

  • 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
  • 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
  • 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。

假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0 。

注意:

  • 本题中的空白字符只包括空格字符 ' '。
  • 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  231 − 1 或 −231。

方案一:直接求解

class Solution {
public:
    int myAtoi(string s) {
        s.erase(0, s.find_first_not_of(" "));
        s.erase(s.find_last_not_of(" ") + 1);
        if (s.length() == 0 || ((s[0] != '+') && (s[0] != '-') && (s[0] < '0' || s[0] > '9'))) {
            return 0;
        }
        int num = 0;
        int sign = 1;
        for (int i = 0; i < s.length(); i++) {
            if ((0 == i) && (s[i] == '+')) {
                continue;
            }
            if ((0 == i) && (s[i] == '-')) {
                sign = -1;
                continue;
            }
            if (s[i] < '0' || s[i] > '9') {
                break;
            }
            if ((num > INT_MAX / 10) || (num == INT_MAX / 10 && s[i] - 48 > 7)) {
                return INT_MAX;
            }
            if ((num < INT_MIN / 10) || (num == INT_MIN / 10 && s[i] - 48 > 8)) {
                return INT_MIN;
            }
            num = num * 10 + (s[i] - 48) * sign;
        }
        return num;
    }
};

代码略显臃肿。

方案二:自动机

leetcode——字符串转换整数(atoi)

转成表格为:

  空白字符 '+'或者'-' 数字 其他
start start sign in_number end
sign end end in_number end
in_number end end in_number end
end end end end end
class Automaton {
private:
    string state = "start";
    unordered_map<string, vector<string>> table = {
        {"start", {"start", "sign", "in_number", "end"}},
        {"sign", {"end", "end", "in_number", "end"}},
        {"in_number", {"end", "end", "in_number", "end"}},
        {"end", {"end", "end", "end", "end"}}
    };
    int get_col(char c) {
        if (isspace(c)) {
            return 0;
        } else if (c == '+' || c == '-') {
            return 1;
        } else if (isdigit(c)) {
            return 2;
        } else {
            return 3;
        }
    }
public:
    int sign = 1;
    long long ans = 0;
    void get(char c) {
        state = table[state][get_col(c)];
        if (state == "in_number") {
            ans = ans * 10 + c - '0';
            ans = (sign == 1) ? (min(ans, (long long)INT_MAX)) : (min(ans, -(long long)INT_MIN));
        } else if (state == "sign" && c == '-') {
            sign = -1;
        }
    }
};
class Solution {
public:
    int myAtoi(string s) {
       Automaton automaton;
       for (char c: s) {
           automaton.get(c);
       }
        return automaton.ans * automaton.sign;
    }
};

时间复杂度O(N), 空间复杂度O(1)

上一篇:CentOS7部署Cacti监控


下一篇:【leetCode】之String to Integer (atoi)