代码
/**
* @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
};
思路
其实就是把所有的情况考虑成 各个状态之间的互相跳转,如下表所示
空 | +/- | 数字 | 其他 | |
---|---|---|---|---|
开始 | 开始 | 存在符号 | 数字转换 | 结束 |
存在符号 | 结束 | 结束 | 数字转换 | 结束 |
数字转换 | 结束 | 结束 | 数字转换 | 结束 |
结束 | 结束 | 结束 | 结束 | 结束 |
在开始状态下 碰到 四种情况 就切换到对应的状态 继续下一个字符 以此类推
举例:开始状态
下 碰到+/-
就变成 存在符号
的状态