题目:传送门
题意: 这个题就是给你一个字符串,然后你提取出整数,这是题目的要求:
我的思路就是直接暴力遍历一遍,找到符合条件的数字,暴力就很简单,但是这种问题必须要考虑全面,考虑出各种可能情况,因此写这种题必须要认真,如果不认真,你就可能这样:
所以考虑问题必须要全面,根据题目要求想到要面临的各种情况,两个‘+’,如何判断这个数字是否超出int范围,何时应该截断…
上代码:
class Solution {
public:
///-2147483648 - 2147483647
int myAtoi(string s) {
int flag,i,x=0;
for(i=0;i<s.size();i++){
if(s[i]==' ')
continue;
else if(s[i]=='+'||s[i]=='-'||(s[i]>=0&&s[i]>=9))
break;
else
return 0;
}
if(s[i]=='-'){
flag=-1;
i++;
}
else{
flag=1;
if(s[i]=='+')
i++;
}
for(;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9'){
int a=s[i]-'0';
if(flag<0){
if(x>INT_MAX/10){
return INT_MIN;
}else if(x==INT_MAX/10){
if(a>=8){
cout<<"1"<<endl;
return INT_MIN;
}else{
x=-1*x*10-a;
if(i+1>=s.size())
return x;
else if(s[i+1]>='0'&&s[i+1]<='9')
return INT_MIN;
else
return x;
}
}else{
x=x*10+a;
}
}else{
if(x>INT_MAX/10){
return INT_MAX;
}else if(x==INT_MAX/10){
if(a>=7){
return INT_MAX;
}else{
x=x*10+a;
if(i+1>=s.size())
return x;
else if(s[i+1]>='0'&&s[i+1]<='9')
return INT_MAX;
else
return x;
}
}else{
x=x*10+a;
}
}
}else{
break;
}
}
return x*flag;
}
};
这个代码我们一眼就能看出缺陷,代码长而且繁琐。虽然也是这道题的解法,但是并不好。然后我就看了力扣官方题解,官方给了一个自动机的题解,将各种状态进行保存,然后遍历字符,判断状态,让我们看看官方给的图:
这个图就包含了所有的情况,然后让我们看看官方的代码:
class Automaton {
string state = "start";
unordered_map<string, vector<string>> table = {
{"start", {"start", "signed", "in_number", "end"}},
{"signed", {"end", "end", "in_number", "end"}},
{"in_number", {"end", "end", "in_number", "end"}},
{"end", {"end", "end", "end", "end"}}
};
int get_col(char c) {
if (isspace(c)) return 0;
if (c == '+' or c == '-') return 1;
if (isdigit(c)) return 2;
return 3;
}
public:
int sign = 1;
long long ans = 0;
void get(char c) {
state = table[state][get_col(c)];
if (state == "in_number") {
ans = ans * 10 + c - '0';
ans = sign == 1 ? min(ans, (long long)INT_MAX) : min(ans, -(long long)INT_MIN);
}
else if (state == "signed")
sign = c == '+' ? 1 : -1;
}
};
class Solution {
public:
int myAtoi(string str) {
Automaton automaton;
for (char c : str)
automaton.get(c);
return automaton.sign * automaton.ans;
}
};
两个代码相比,就能发现官方给的代码简洁性和可读性都更加好。学无止境,加油