Pregunta 8 de LeetCode: Convertir una cadena a un número entero (atoi) (use el método de transición de estado de DFA para responder)

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;
    }
};

Supongo que te gusta

Origin blog.csdn.net/lyb06/article/details/129465915
Recomendado
Clasificación