Convertir números romanos a números enteros (C++/Python)

Los números romanos contienen los siguientes siete caracteres: I, V, X, L, C, D y M.

Valor de carácter
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

Por ejemplo, el número romano 2 se escribe como II, que son dos unos uno al lado del otro, y el 12 se escribe como XII, que es X + II. 27 se escribe XXVII, que es XX + V + II.

Normalmente, los números más pequeños en números romanos están a la derecha de los números más grandes. Pero hay casos especiales, por ejemplo el 4 no se escribe como IIII, sino como IV. El número 1 está a la izquierda del número 5 y representa un número igual al número grande 5 menos el número 1, que es el valor 4. Asimismo, el número 9 se representa como IX. Esta regla especial sólo se aplica a las seis situaciones siguientes:

Puedo colocarme a la izquierda de V (5) y X (10) para representar 4 y 9.
X se puede colocar a la izquierda de L (50) y C (100) para representar 40 y 90.
C se puede colocar a la izquierda de D (500) y M (1000) para representar 400 y 900.
Dado un número romano, conviértalo a un número entero. Asegúrese de que la entrada esté en el rango de 1 a 3999.

Ejemplo 1:

Entrada: "III"
Salida: 3

Ejemplo 2:

Entrada: "IV"
Salida: 4

Ejemplo 3:

Entrada: "IX"
Salida: 9

Ejemplo 4:

Entrada: "LVIII"
Salida: 58 Explicación: L = 50, V= 5, III = 3.

Ejemplo 5:

Entrada: "MCMXCIV"
Salida: 1994
Explicación: M = 1000, CM = 900, XC = 90, IV = 4.

pista:

1 <= s.length <= 15
s contiene solo caracteres ('I', 'V', 'X', 'L', 'C', 'D', 'M') datos de preguntas para garantizar que s sea un
números romanos válidos e indica que el número entero está dentro del rango [1, 3999].
Todos los casos de prueba dados en la pregunta cumplen con las reglas de escritura de números romanos y no habrá situaciones superpuestas.
Ejemplos como IL e IM no cumplen con los requisitos de la pregunta. 49 debe escribirse como XLIX y 999 debe escribirse como CMXCIX.
Para conocer las reglas detalladas de escritura de números romanos, consulte Números romanos-Matemáticas.

Este problema se puede resolver fácilmente usando el mapa, que se puede resolver de izquierda a derecha o nuevamente de izquierda a izquierda.

C++ (de izquierda a derecha)

class Solution {
    
    
private:
    unordered_map<char,int>symbolValues = {
    
    
        {
    
    'I',1},
        {
    
    'V',5},
        {
    
    'X',10},
        {
    
    'L',50},
        {
    
    'C',100},
        {
    
    'D',500},
        {
    
    'M',1000},
    };

public:
    int romanToInt(string s) {
    
    
        int ans = 0;
        int n = s.length();
        for(int i = 0; i < n; ++i){
    
    
            int value = symbolValues[s[i]];
            if(i < n - 1 && value < symbolValues[s[i+1]] ){
    
    
                ans -= value;
            }else{
    
    
                ans += value;
            }
        }
        return ans;
    }
};

Python3 (de derecha a izquierda)

class Solution:
    def romanToInt(self, s: str) -> int:
        mapping = {
    
    
            'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000
        }
        highestLevel = 1
        result = 0
        for ch in s[::-1]:
            level = mapping[ch]
            if level >= highestLevel:
                result += level
                highestLevel = level
            else:
                result -= level
        return result

Supongo que te gusta

Origin blog.csdn.net/smile66688/article/details/120356185
Recomendado
Clasificación