算法(附思维导图全部解法)300题之(8)字符串转换整数(a
零标题:算法(leetode,附思维导图全部解法)300题之(8)字符串转换整数(atoi)
导读:
我的解法很多且很sao,你忍一下
一题目描述
题目描述
题目描述
题目描述
题目描述
二解法总览(思维导图)
思维导图
三全部解法1方案1
1)代码:方案1varmyAtoifunction(s){constls。length,numStrArr〔0,1,2,3,4,5,6,7,8,9〕;letindex0,正、负情况signundefined,结果字符串resStr;1)不断去掉前面的空格字符while(indexls〔index〕){index;}2)去完前面的空格字符后,后面的第一个字符必须是、或数值字符不是的话直接返回0if(indexl){if(s〔index〕s〔index〕){signs〔index〕;resStrsign;}else{if(numStrArr。includes(s〔index〕)){resStrs〔index〕;}else{return0;}}}3)、号确定后,不断往后读取数值字符(若是遇到非数值字符就没必要往下读了)并不断存入resStrindex1;while(indexlnumStrArr。includes(s〔index〕)){resStrs〔index〕;index;}letresValueparseInt(resStr);边界1:12(核心:只有、字符等,此时parseInt(resStr)为NaN,即NotANumber)resValueNumber。isNaN(resValue)?0:resValue;边界2:范围的上下界处理resValueresValueMath。pow(2,31)?Math。pow(2,31):resValue;resValueresValueMath。pow(2,31)1?Math。pow(2,31)1:resValue;4)返回最终的结果returnresValue;}2方案2
1)代码:方案2方案1的优化版,其实没必要进行去前面空格字符等操作,直接使用JS自带的parseInt()varmyAtoifunction(str){1)直接使用parseInt(),其帮我们少了不少前置处理工作letresValueparseInt(str);2)边界处理边界1:12(核心:只有、字符等,此时parseInt(resStr)为NaN,即NotANumber)if(isNaN(resValue)){return0;}else{边界2:范围的上下界处理resValueresValueMath。pow(2,31)?Math。pow(2,31):resValue;resValueresValueMath。pow(2,31)1?Math。pow(2,31)1:resValue;}3)返回最终的结果returnresValue;};3方案3
1)代码:方案3状态机varmyAtoifunction(str){根据当前字符char,获取要变更为哪个状态stateconstgetStateIndexchar{constnumStrArr〔0,1,2,3,4,5,6,7,8,9〕;初始化流转值为end状态,其实也可以有别的写法letresStateIndex3;if(char){resStateIndex0;}elseif(charchar){resStateIndex1;}elseif(numStrArr。includes(char)){resStateIndex2;}returnresStateIndex;};1)初始化各种值等,特别是tableMap的定义!!constlstr。length,状态机的表格形式tableMap{start:〔start,signed,innumber,end〕,signed:〔end,end,innumber,end〕,innumber:〔end,end,innumber,end〕,end:〔end,end,end,end〕,};state:当前的状态state值letstatestart,sign1,index0,resValue0;2)不断向后遍历字符串str,根据当前遍历到的字符char去不断更新state、resValue、sign等值,当indexlstateend时,退出遍历while(indexl){constcharstr〔index〕;statetableMap〔state〕〔getStateIndex(char)〕;if(stateinnumber){resValueresValue10parseInt(char);}elseif(statesigned){因为sign初始化为1,所以为时才有必要处理if(char){sign1;}}index;优化:当前state为end,就可以退出、不用再遍历if(stateend){break;}}3)恢复符号resValuesign;4)边界处理边界1:范围的上下界处理resValueresValueMath。pow(2,31)?Math。pow(2,31):resValue;resValueresValueMath。pow(2,31)1?Math。pow(2,31)1:resValue;5)返回结果returnresValue;}