leetcode-字符串转换整数 (atoi) :) 传说中的状态机

代码

/**
 * @param {string} str
 * @return {number}
 */
var myAtoi = function(str) {
    let map = [
        [0,1,2,3],
        [3,3,2,3],
        [3,3,2,3],
    ]
    let reg =/[0-9]/
    let r='';
    let state = 0;
    for(let i=0,l=str.length;i<l;i++){
        if(str[i]==' '){
            state = map[state][0];
        }else if(str[i]=='+'||str[i]=='-'){
            state = map[state][1];
        }else if(reg.test(str[i])){
            state = map[state][2];
        }else{
            state = map[state][3];
        }
        if(state==0){
            continue
        }
        if(state==1||state==2){
            r +=str[i]
        }
        if(state==3){
            break
        }
    }
    if(r==''||r=='-'||r=='+') return 0;
    let num = Number(r);
    if (num > 2147483647) {
        return 2147483647
    }
    if (num < -2147483648) {
        return -2147483648
    }
    return num
};

思路

其实就是把所有的情况考虑成 各个状态之间的互相跳转,如下表所示

+/-数字其他
开始开始存在符号数字转换结束
存在符号结束结束数字转换结束
数字转换结束结束数字转换结束
结束结束结束结束结束

在开始状态下 碰到 四种情况 就切换到对应的状态 继续下一个字符 以此类推

举例:开始状态下 碰到+/- 就变成 存在符号的状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值