class Solution {
public:
    int atoi(const char *str) {
        int idx = 0, sign = 1, val = 0;
        if(strlen(str) == 0) return 0;
        while(str[idx] == ' ') ++idx;
        if(str[idx] == '-') {sign = -1; ++idx;}
        if(str[idx] == '+') {++idx;}
        for(; idx < strlen(str); ++idx){
            if(str[idx] > '9') break;
            // 越界处理, 保证下一步val*10 + str[idx] - '0' 不能大于最大值
            // 但是判断是时要分开判断,val*10 和 str[idx] - '0' 把数字尽量变小,防止越界
            // val 大于 最大整数/10 越界,不能 val * 10 大于 最大整数, val * 10 会越界。
            // 当 val 等于 最大值/10 时 判断剩下的str[idx] - '0' 是否大于 最大值%10,防止相加后会越界 
             if(val > INT32_MAX / 10 || (val== INT32_MAX/10 && INT32_MAX % 10 < str[idx] - '0')){
                return sign == 1 ? INT32_MAX : INT32_MIN;
            }
            val = val * 10 + str[idx] - '0';
        }
        return val * sign;
    }
};