algoritmo derrotado - convierte un número entero de cadena

Artículo de referencia

A partir del examen en LeetCode - cadena a entero, este artículo es principalmente una solución oficial a un problema en la referencia LeetCode

La solución oficial a un problema con el concepto de la teoría del compilador de autómatas finitos, no esperaba que la teoría del compilador de conocimiento puede ser aplicado al algoritmo, por lo que en este artículo Scala versión grabada de la solución, pero no las preguntas específicas entenderán los informes, quiere ver una explicación detallada Por favor forzar también la hebilla oficial sitio web del lugar

https://leetcode-cn.com/problems/string-to-integer-atoi/

Convertir una cadena de problemas de números enteros

En primer lugar, la función se iniciará con un carácter de espacio descarta inútil si es necesario, hasta que el hallazgo al primer carácter no-espacio hasta ahora. Las siguientes reglas de conversión son como sigue:

  • Si el primer carácter es un positivo no nulo o número negativo, la señal de la vuelta con tantos caracteres numéricos consecutivos se combinan para formar un entero con signo
  • Si el primer carácter no-espacio es un número, que es directamente después de la combinación continua de caracteres numéricos, formando un número entero
  • La cadena también puede haber caracteres adicionales después de una parte entera válida, estos caracteres pueden ser ignorados, no deben afectar la función de

nota:

Si la cadena cuando el primer carácter que no sea espacio no es una cadena de caracteres entero válido está vacío o contiene sólo la cadena de caracteres de espacio en blanco, la función no requiere que usted para convertir esa conversión no puede ser eficaz. En cualquier caso, si la función no puede convertir de manera efectiva, devuelve 0

Consejo:
El título incluye sólo carácter de espacio espacio en blanco ''
se supone que podemos almacenar entorno de 32 bits sized entero con signo, entonces el rango de valores de [
- 231 231  - 1]. Si el valor excede este rango, volver INT_MAX (231  - . 1) o INT_MIN ( - 231)

Ejemplo 1:
Entrada: "42
de salida: 42

Ejemplo 2:
Entrada: "-42"
de salida: -4
explicación: el primer caracter no blanco es '-', es un signo negativo, como un número negativo y todos los números en una fila detrás de la cosechadora, y finalmente obtenemos -42

Ejemplo 3:
Entrada: "4193 con las palabras"
de la salida: 4193
Explicación: convertir el apagado digital de '3' como su próximo personaje no es una cámara digital

Ejemplo 4:
Entrada: "palabras y 987"
de salida: 0
Explicación: válido es un primer carácter no blanco 'w', pero no es un número positivo o un número negativo, y por lo tanto no se puede realizar la conversión

Ejemplo 5:
entrada: "-91,283,472,332
de salida: -2147483648
explicación: el número" -91,283,472,332 "más de 32 firmado rango entero, el flujo vuelve INT_MIN (
- 231)

 

Autómatas finitos deterministas cinco elementos de DFA

Es decir pentada = A (K, [Sigma, [delta], Q 0 , el Z)

conjunto finito de K; [Sigma conjunto finito de símbolos de entrada; función de transición [delta]; un estado de inicio Q 0 ; definitivo set estado Z

Función de transferencia δ: K × Σ → K, excepciones: δ (q, ε) = q

Aquí en la página oficial de los préstamos diagrama de transición para ilustrar los conceptos que

conjunto finito K = {empezar, firmado, in_number, end}

conjunto finito de símbolos de entrada Σ = {número, +, - , ︺, otro}
en el presente documento, "número" se refiere a los dígitos diez 0 a 9, "otro" se refiere a todos los demás caracteres además de números, un signo positivo y espacios

Función de transferencia δ (inicio, +) = δ (inicio, -) = firmado, δ (firmado, número) = número otras funciones de transferencia no son ejemplos excesivas

Principal Estado de Q 0 = inicio

Final conjunto estado Z = {end}

web oficial también proporciona una tabla de transición representación de

Si el símbolo de entrada puede corresponder a una pluralidad de otros estados del estado, en un finito no determinista autómata NFA

 

solución de DFA

def myAtoi ( str: String ) : Int = {
  / *
   *
构造转移表
   * /
  var
mapa = nueva mutable . HashMap [ Cadena , Lista [ cadena ]] ()
  Mapa + = ( "Inicio" -> Lista ( "Inicio" , "firmado" , "in_number" , "fin" ))
  mapear + = ( "firmado" -> Lista ( ", "Extremo" , "in_number" , "fin" ))
  mapear + = ( "in_number" -> Lista ( "extremo" , "extremo" , "in_number" , "fin" ))
  mapear + = ( "fin" - > Lista ( "extremo" , "extremo" , "extremo" , "fin"))
  
  / *
   *
Coordinar tabla de transición dedxyDy
   *
estado de inicio
Start
   * /
  var
dx="Inicio"
  var Dy = 0
  / *
   *
récord negativo
   * /
  var
sesión = 1.
  / *
   *
Almacenamiento de los resultados
   * /
  var
ANS = 0
  para ( carbón <STR - SI DX ! = "Fin" ) {
    Dy = SI ( Char . isWhitespace ) 0
         la IF más ( Char == '+' || Char == '-' ) . 1
         else if ( Char . isdigit ) 2
         más 3

    dx = mapa ( dx ) ( dy )
    si ( dx == "in_number" ) {
    / *
     *
判断是否超出Int范围
     * /
      si
((Int.MaxValue-Char+'0 ')/10<ans)
        de retorno si(signo==1) Int. Valor máximootra cosa Int. MinValue
      demás
        ans = ans * 10 + Char - '0'
    } else if ( dx == "firmado" ) {
      signo = si ( Char == '+' ) 1 persona - 1
    }
  }

  American National Standard * signo
}

Supongo que te gusta

Origin www.cnblogs.com/kuluo/p/12656450.html
Recomendado
Clasificación