剑指 Offer 67. 把字符串转换成整数【力扣】

题意理解

给定一个字符串,按照规则转换成整数,如果大于INT_MAX,设置为INT_MAX;如果小于INT_MIN,设置为INT_MIN;如果不是整数,设置成0

问题分析

自动状态机+整数边界判断。

其他

 

 

链接

class Solution {
public:
    int strToInt(string str) {
        enum STATUS_TYPE {
            START,
            ONE,
            TWO,
            THREE
        };
        enum INPUT_TYPE {
            BACKSPACE,
            SIGN,
            NUM,
            OTHER
        };
        unordered_map<STATUS_TYPE, unordered_map<INPUT_TYPE, STATUS_TYPE>> my_dict = {
            {
                START, {
                    {BACKSPACE, ONE},
                    {SIGN, TWO},
                    {NUM, THREE}
                }
            },
            {
                ONE, {
                    {BACKSPACE, ONE},
                    {SIGN, TWO},
                    {NUM, THREE}
                }
            },
            {
                TWO, {
                    {NUM, THREE}
                }
            },
            {
                THREE, {
                    {NUM, THREE}
                }
            }
        };
        STATUS_TYPE st = START;
        INPUT_TYPE input;
        bool flag = 0;
        int start = 0;
        int end = 0;
        long VAL = 1;
        bool first = true;
        for(int i = 0; i < str.size(); i++) {   
            //cout << "flag " << flag << endl;  
            char ch = str[i]; 
            if (ch == ' ') {
                input = BACKSPACE;
            }
            else if (ch == '+'){
                input = SIGN;
            }
            else if (ch == '-') {
                input = SIGN;
                flag = flag ? 0 : 1;
            }
            else if (ch >= '0' && ch <= '9') {
                input = NUM;
                if (first) {
                    VAL = ch - '0';
                    first = false;
                }
                else {
                    VAL = 10 * VAL + ch - '0';
                    cout << VAL << endl;
                    if (flag == 0) {
                        if (VAL > INT_MAX) {
                            VAL = INT_MAX;
                            break;
                        }
                    }
                    else {
                        long tmpVAL = -1 * VAL;
                        if (tmpVAL < INT_MIN) {
                            VAL = INT_MIN;
                            break;
                        }
                    }
                } 
                
            }
            else {
                input = OTHER;
            }
            cout << "input " << input << endl;
            if(my_dict[st].count(input)) {
                st = my_dict[st][input];
            }
            else {
                if (ch == '-') flag = flag ? 0 : 1;  //修正bug
                break;
            }
            cout << st << endl;
        }

        if (st == START || st == ONE || st == TWO) {
            return 0;
        }
        //cout << VAL << endl;
        if (flag) return -1 * VAL;
        else return VAL;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值