https://oj.leetcode.com/problems/string-to-integer-atoi/
这道题可以看做valid number的变种。首先按照正则表达式^\s*[+,-]?[0-9]+*$构造出转换表。然后根据输入进行状态机转换。
在状态转换过程中将数字和符号分别存储起来,最后再将其转换为数字即可。
有在转换过程中构造出数字的优化空间。
int trans[4][5]={
{ 0, 1, 2,-1,-1},
{-1,-1, 2,-1,-1},
{ 3, 3, 2, 4, 3},
{ 3, 3, 3, 4, 3}
};
class Solution {
public:
int m,n;
const char *str;
string numStr;
char flag;
int GetTrans(char ch){
if (ch==' '){return 0;}
if (ch=='+'|| ch=='-'){return 1;}
if (ch>='0' && ch<='9'){return 2;}
if (ch=='\0'){return 3;}
return 4;
}
int Solve(int p,int stat){
if (stat==4){return 4;}
if (stat==-1){return -1;}
int ns=trans[stat][GetTrans(str[p])];
if (ns==1){
flag=str[p];
}
if (ns==2){
numStr.push_back(str[p]);
}
return Solve(p+1,ns);
}
int Change(){
m=numStr.length();
long long res=0;
long long dig=1;
for (int i=m-1;i>=0;i--){
int cur=numStr[i]-'0';
res+=cur*dig;
dig*=10;
}
if (flag=='-'){
res*=-1;
}
if (res > numeric_limits<int>::max()){
res=numeric_limits<int>::max();
}
if (res < numeric_limits<int>::min()){
res=numeric_limits<int>::min();
}
return res;
}
int atoi(const char *str) {
int stat=0; //^\s*[+,-]?[0-9]+*$
this->str=str;
flag='+';
if(Solve(0,0)==-1){
return 0;
}
else{
return Change();
}
}
};