Esta pregunta se puede responder mediante el método de autómatas (DFA), y el método DFA en realidad se responde mediante transición de estado.
Según el título, podemos dividir el proceso de solución en cuatro estados:
estado inicial - inicio - 0
estado del signo - signo - 1
estado del número - num - 2
Estado final - fin - 3
Registre estos cuatro estados como 0,1,2,3 respectivamente. El programa comienza desde el estado inicial 0 y se detiene cuando alcanza el estado terminal 3.
A partir del estado inicial, recorra la cadena s. Se leen cuatro tipos de caracteres: espacios, bits de signo, números y otros caracteres.
Cuando estos cuatro personajes se encuentran en cada estado:
estado inicial 0
Cuando se encuentra un espacio, el estado permanece sin cambios y el siguiente carácter se lee directamente;
Encuentre un bit de signo, registre el símbolo leído y cambie el estado al estado de símbolo 1;
Encuentre un número, registre el número y cambie el estado al estado digital 2;
Cuando se encuentran otros caracteres, el estado cambia al estado de terminación 3.
estado del símbolo 1
Cuando se encuentra un espacio, el estado cambia al estado de terminación 3;
Cuando se encuentra el bit de signo, el estado cambia al estado de terminación 3; (cuando s="+-12", la salida debe ser 0, por lo que se encuentran dos bits de signo para terminar)
Encuentre un número, registre el número y cambie el estado al estado digital 2;
Cuando se encuentran otros caracteres, el estado cambia al estado de terminación 3.
estado digital 2
Cuando se encuentra un espacio, el estado cambia al estado de terminación 3;
Cuando se encuentre un bit de signo, cambie el estado al estado de terminación 3;
Encuentre un número, regístrelo y el estado permanecerá sin cambios;
Cuando se encuentran otros caracteres, el estado cambia al estado de terminación 3.
Estado de terminación 3
Termine directamente el recorrido y devuelva el resultado obtenido.
Por tanto, la función de transición de estado se puede obtener:
espacio |
bit de signo |
número |
otro |
||
0 |
inicio inicial |
0 |
1 |
2 |
3 |
1 |
signo simbolo |
3 |
3 |
2 |
3 |
2 |
numero numero |
3 |
3 |
2 |
3 |
3 |
terminar fin |
Con la función de transición de estado, podemos escribir fácilmente el proceso de solución:
Aquí está la respuesta usando Python:
class Solution:
def myAtoi(self, s: str) -> int:
"""使用DFA方法实现atoi"""
sign_dist = {'+':1, '-':-1} # 符号标识种子
num_seed = '0123456789' # 数字字符种子
sign = 1 # 符号标识,1为正,-1为负
status = 0 # 初始状态为0
# 0-初始start 1-符号sign 2-数字num 3-终止end
integer = 0 # 最终要返回的整数
# 遍历字符串s
for c in s:
# 0-初始状态start
if status == 0:
if c == ' ':
continue
elif c == '+' or c == '-':
sign = sign_dist[c]
status = 1
elif c in num_seed:
integer = 10*integer + int(c)
status = 2
else:
status = 3
# 1-符号状态sign
elif status == 1:
if c == ' ' or c == '+' or c == '-':
status = 3
elif c in num_seed:
integer = 10*integer + int(c)
status = 2
else:
status = 3
# 2-数字状态num
elif status == 2:
if c == ' ' or c == '+' or c == '-':
status = 3
elif c in num_seed:
integer = 10*integer + int(c)
# 判断是否越界,越界直接返回边界值
if integer * sign < -1 * 2**31:
return -1 * 2**31
elif integer * sign > 2**31 - 1:
return 2**31 - 1
else:
status = 3
# 3-终止状态end
elif status == 3:
break
# 返回最终结果
return integer * sign
Aquí está el proceso de solución usando C++:
class Solution {
public:
int myAtoi(string s) {
// 使用DFA实现atoi
string sign_seed = "+-"; // 符号标识种子
int sign = 1; // 符号标识
int status = 0; // 初始状态为0
// 0-初始start 1-符号sign 2-数字num 3-终止end
long long integer = 0;// 最终要返回的整数
// 遍历字符串s
for(int i = 0; i < s.size(); i++){
// 通过switch进入不同的状态
switch(status){
// 0-初始状态start
case 0:
if(s[i] == ' '){
break;
}
else if(s[i] == sign_seed[0]){
sign = 1;
status = 1;
}
else if(s[i] == sign_seed[1]){
sign = -1;
status = 1;
}
else if(s[i] >= '0' && s[i] <= '9'){
integer = 10 * integer + (s[i] - '0');
status = 2;
}
else{
status = 3;
}
break;
// 1-符号状态sign
case 1:
if(s[i] == ' '){
status = 3;
}
else if(s[i] == sign_seed[0] || s[i] == sign_seed[1]){
status = 3;
}
else if(s[i] >= '0' && s[i] <= '9'){
integer = 10 * integer + (s[i] - '0');
status = 2;
}
else{
status = 3;
}
break;
// 2-数字状态num
case 2:
if(s[i] == ' '){
status = 3;
}
else if(s[i] == sign_seed[0] || s[i] == sign_seed[1]){
status = 3;
}
else if(s[i] >= '0' && s[i] <= '9'){
integer = 10 * integer + (s[i] - '0');
// 判断是否越界,越界直接返回边界值
if(integer * sign > 2147483647){
return 2147483647;
}
else if(integer * sign < -2147483648){
return -2147483648;
}
}
else{
status = 3;
}
break;
// 3-终止状态end
case 3:
break;
}
if(status == 3){
break;
}
}
return integer * sign;
}
};