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