2019年10月30日 星期三

[LeetCode] String to Integer (atoi)

思路: 先處理 prefix, 分別判斷合法字元 +, -, 後面再處理數字部分, 以 double 暫存判斷是否會 overflow or underflow
class Solution {
public:
    int isValidChar(char c) {
        if (c >= '0' && c <= '9')
            return 1;
        else
            return 0;
    }
    
    int myAtoi(string str) {
        double testVal = 0.0;
        int absVal = 0;
        int sign = 1;
        
        int i = 0;
        // prefix
        for (i = 0; i < str.length(); i++) {
            // whitespace
            if (str[i] == ' ')
                continue;
            else if (str[i] == '+' || str[i] == '-') {
                if (str[i] == '-') sign = -1;
                i++;
                break;
            } else if (isValidChar(str[i])) {
                break;
            } else {    // illegal prefix
                return 0;
            }
        }

        for (; i< str.length(); i++) {
            if (isValidChar(str[i])) {
                testVal = 10.0 * absVal + (str[i] - '0');
                if (sign * testVal >= INT_MAX) {
                    return INT_MAX;
                } else if (sign * testVal <= INT_MIN) {
                    return INT_MIN;
                } else {
                    absVal = (int) testVal;
                }
            } else {
                break;
            }
        }
        return sign * absVal;
    }
};