这个题不难,但是细节挺多的,我也调试了两三次才OK
问题拆分:
1.得到有效字符串
   1.为了掐头去尾,我设计了一个起始标志跟结束标志。
   2.+,-,0-9算有效字符
   3.剩下就是一些边界问题
2.把有效字符串转成int
   1.设置一个符号位,最后用得上
   2.遍历字符串
   3.处理边界

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    int StrToInt(string s) {
        // write code here
        bool pre = true;
        bool end = false;
        string res = "";
        
        for(int i=0;i<s.size();i++){
            if(s[i] == '+' || s[i] == '-' || (s[i] >= '0' && s[i] <= '9') ){
                if(!pre && (s[i] == '+' || s[i] == '-')){
                    pre = false;
                    end = true;
                    break;
                }
                res += s[i];
                pre = false;
            }else{
                if(s[i] == ' '){
                    if(pre || end){
                        continue;
                    }
                }
                
                pre = false;
                end = true;
                break;
            }
        }
        
        if(res.size() > 0){
            return formatStrToInt(res);
        }else{
            return 0;
        }
    }
    
    int formatStrToInt(string s) {
//         cout << "s is " << s << endl;
        long ret = 0;
        int i = 0;
        bool isPositive = true;
        if(s[0] == '+'){
            i++;
        }else if(s[0] == '-'){
            i++;
            isPositive = false;
        }
        
        while(i < s.length()){
            ret *= 10;
            ret += (s[i] - '0');
//             printf("ret = %d,s[%d] = %d\n",ret,i,(s[i] - '0'));
            if(isPositive && ret > pow(2, 31)-1){
                return pow(2,31)-1;
            }
            if(!isPositive && ret > pow(2, 31)){
                return -pow(2,31);
            }
            i++;
        }
        
        return isPositive ? ret : -ret;
    }
};