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 inicioStart
* /
vardx="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
}