[Preguntas de pincel de Leetcode] Algoritmo: convertir números romanos en enteros

Directorio de artículos

1. Problemas

inserte la descripción de la imagen aquí

2. Comprensión del código

class Solution:
    def romanToInt(self, s: str) -> int:
        answer=0
        length = len(s)
        d={
    
    'I':1,'V':5,'X':10, 'L':50,'C':100, 'D':500,'M':1000}
        for i in range(length-1):
            if d[s[i+1]]>d[s[i]]:
                answer=answer-d[s[i]]
            else:
                answer=answer+d[s[i]]
        answer=answer+d[s[length-1]]
        return answer
  • Defina una clase de solución que contenga un método romanToInt para convertir números romanos en enteros.
  • Inicialice la respuesta variable a 0 para almacenar el valor entero convertido.
  • Obtenga la longitud de la cadena de entrada s y guárdela en la longitud variable.
  • Cree un diccionario d que asigne cada carácter numérico romano al valor numérico correspondiente.
  • Use un bucle for para iterar a través de cada carácter en s, desde el primer carácter hasta el penúltimo carácter.
  • Si el valor numérico del carácter actual es menor que el valor numérico del carácter siguiente, reste el valor numérico del carácter actual de la respuesta.
  • De lo contrario, agregue la respuesta al valor numérico del carácter actual.
  • Agregue respuesta al valor correspondiente al último carácter para completar la conversión del número romano completo.
  • Devuelve la respuesta del resultado final.

El propósito de este código es recorrer la cadena de números romanos y, de acuerdo con la relación de tamaño de los caracteres adyacentes, acumular o restar los valores correspondientes en la respuesta y, finalmente, obtener los números romanos en forma de números enteros.

La segunda opción:

class Solution:
    def romanToInt(self, s: str) -> int:
        answer = 0
        length = len(s)
        d = {
    
    'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        
        for i in range(length-1):
            if d[s[i]] < d[s[i+1]]:
                answer -= d[s[i]]
            else:
                answer += d[s[i]]
        
        answer += d[s[length-1]]
        
        return answer

intentar otra vez:

class Solution:
    def romanToInt(self, s: str) -> int:
        d = {
    
    
            'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000
        }
        res = 0
        prev_val = 0
        
        for c in reversed(s):
            curr_val = d[c]
            if curr_val < prev_val:
                res -= curr_val
            else:
                res += curr_val
            prev_val = curr_val
        
        return res

Última versión:

class Solution:
    def romanToInt(self, s: str) -> int:
        roman_values = {
    
    
            'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000
        }
        res = 0
        prev_val = 0
        
        for c in reversed(s):
            curr_val = roman_values[c]
            if curr_val < prev_val:
                res -= curr_val
            else:
                res += curr_val
            prev_val = curr_val
        
        return res
  • Defina una clase de solución que contenga un método romanToInt para convertir números romanos en enteros.
  • Cree un diccionario roman_values ​​​​que asigne cada carácter de número romano a su valor correspondiente.
  • Inicialice la variable res a 0, que se utiliza para guardar el valor entero convertido.
  • Inicialice la variable prev_val a 0, que se utiliza para guardar el valor del carácter anterior.
  • Use la función reversed() para iterar en sentido inverso sobre la cadena s, desde el último carácter hasta el primero.
  • Para cada carácter c, obtenga su valor correspondiente curr_val.
  • Si curr_val es menor que prev_val, significa que se debe restar el valor representado por el carácter actual, así que restarlo de res.
  • De lo contrario, agregue curr_val a res.
  • Actualice prev_val al valor del carácter actual.
  • Devuelve el resultado final res, que es un número romano en forma de número entero.

El propósito de este código es iterar inversamente la cadena de números romanos, y acumular o restar el valor correspondiente en res según la relación de tamaño de los caracteres adyacentes, y finalmente obtener el número romano en forma de número entero. El código utiliza la función de iteración inversa, que evita el contexto de comparar caracteres cada vez, lo que simplifica la lógica y la implementación del código.

El resultado final es:

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/wzk4869/article/details/130734003
Recomendado
Clasificación