Requisitos de la asignatura
Enlace a la pregunta original
(una pregunta, dos preguntas, llamo al experto directamente)
Código: cuando te encuentres con un personaje especial, espera uno más
class Solution {
public:
map<string, int> m;
int romanToInt(string s) {
int index = 0, num = 0;
string temp;
mapInit();
while (index < s.size())
{
switch (s[index])
{
case 'I':
if (index+1 < s.size() && s[index + 1] == 'V')
{
num += m["IV"];
index += 2;
}
else if (index + 1 < s.size() && s[index + 1] == 'X')
{
num += m["IX"];
index += 2;
}
else
{
num += m["I"];
++index;
}
break;
case 'X':
if (index + 1 < s.size() && s[index + 1] == 'L')
{
num += m["XL"];
index += 2;
}
else if (index + 1 < s.size() && s[index + 1] == 'C')
{
num += m["XC"];
index += 2;
}
else
{
num += m["X"];
++index;
}
break;
case 'C':
if (index + 1 < s.size() && s[index + 1] == 'D')
{
num += m["CD"];
index += 2;
}
else if (index + 1 < s.size() && s[index + 1] == 'M')
{
num += m["CM"];
index += 2;
}
else
{
num += m["C"];
++index;
}
break;
default:
temp = s[index];
num += m[temp];
++index;
break;
}
}
return num;
}
void mapInit()
{
m["I"] = 1;
m["IV"] = 4;
m["V"] = 5;
m["IX"] = 9;
m["X"] = 10;
m["XL"] = 40;
m["L"] = 50;
m["XC"] = 90;
m["C"] = 100;
m["CD"] = 400;
m["D"] = 500;
m["CM"] = 900;
m["M"] = 1000;
}
};
toda la idea
Primero, cree un mapa y almacene los caracteres romanos y sus números enteros correspondientes en el mapa.
Luego escanee los caracteres en la cadena poco a poco de izquierda a derecha:
- Cuando se encuentre con los tres caracteres de 'I', 'X' y 'C', espere un bit más para asegurarse de que no cruzan el límite para determinar si dos caracteres romanos representan un número. Utilice map para consultar el valor correspondiente y agregarlo a la variable de suma.
- Cuando te encuentres con otros personajes, usa el mapa directamente para consultar el valor correspondiente. Agréguelo a la variable suma.
resultado
Hiciste un gran escándalo con el mapa ...