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
};

思路

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

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_38616850/article/details/106675378