tema
Los números romanos contienen los siguientes siete caracteres: I
, V
, X
, L
, C
y D
.M
personaje | valor |
---|---|
I | 1 |
V | 5 |
X | 10 |
l | 50 |
C | 100 |
D | 500 |
METRO | 1000 |
Por ejemplo, los números romanos 2
se escriben como II
, es decir, dos yuxtapuestos 1
. 12
Se escribe XII
como X
+ II
. Está 27
escrito XXVII
como XX
++ .V
II
Normalmente, los dígitos más pequeños en los números romanos están a la derecha de los dígitos más grandes. Pero hay casos especiales, como por ejemplo 4
no escribir como IIII
, sino IV
. El número 1
está en 5
el lado izquierdo del número y el número representado es igual al valor obtenido 5
al reducir el número del número grande . Asimismo, los números se representan como .1
4
9
IX
Esta regla particular se aplica sólo a las siguientes seis situaciones:
I
Se puede colocar a la izquierda deV
(5) yX
(10) para representar 4 y 9.X
Se puede colocar a la izquierda deL
(50) yC
(100) para representar 40 y 90.C
Se puede colocar a la izquierda deD
(500) yM
(1000) para representar 400 y 900.
Dado un número romano, conviértalo a un número entero.
analizar
Cuando las reglas sean claras, analice las características de las reglas.
Característica 1 : Sumar 小数在大树
en circunstancias normales Característica 2 : En caso afirmativo , juzgue si se cumplen los seis casos anteriores y reste.右边
小数在大数
左边
Tomandon
el primero m
como ejemplo, del análisis de características anterior, si los dos números adyacentes son decrecientes, luego agregue ( n>m
= ) y aumente, luego juzgue si n+m
cumple con las seis situaciones, y las características comunes de las seis situaciones son m
sí n
y veces, en este caso ( = )5
10
(n< m && ((n * 5) == m || (n * 10) == m))
n-m
codificación
Paso 1 : Prefabrica la relación entre números romanos y números enteros, y utiliza Map
estructuras o swith
juicios swith
para hacer que los juicios sean más eficientes y consuman menos memoria. Map
El código estructurado es más limpio y legible.
método de cambio:
switch(Character.toString(s.charAt(i))){
case "I": now = 1;break;
case "V": now = 5;break;
case "X": now = 10;break;
case "L": now = 50;break;
case "C": now = 100;break;
case "D": now = 500;break;
case "M": now = 1000;break;
}
Estructura del mapa:
HashMap<String,Integer> h = new HashMap(){
{
put("I",1);put("V",5);put("X",10);put("L",50);put("C",100);put("D",500);put("M",1000);
}};
Paso 2 : recorra la cadena para obtener un número entero correspondiente a cada carácter.
public static int romanToInt(String s) {
int now = 0; // 当前值
int sum = 0; // 总值
int prev = 0; // 上一个值
for (int i = 0; i < s.length(); i++) {
switch(Character.toString(s.charAt(i))){
case "I": now = 1;break;
case "V": now = 5;break;
case "X": now = 10;break;
case "L": now = 50;break;
case "C": now = 100;break;
case "D": now = 500;break;
case "M": now = 1000;break;
}
}
return sum;
}
Paso 3 : Debido a que en circunstancias normales, es resta y suma, el juicio de lógica anormal también es el caso de incremento y resta. 注意
: Es necesario en el caso de resta decremental n-(m*2)
, porque el número a restar se ha incrementado una vez antes.
public static int romanToInt(String s) {
int now = 0; // 当前值
int sum = 0; // 总值
int prev = 0; // 上一个值
for (int i = 0; i < s.length(); i++) {
switch(Character.toString(s.charAt(i))){
case "I": now = 1;break;
case "V": now = 5;break;
case "X": now = 10;break;
case "L": now = 50;break;
case "C": now = 100;break;
case "D": now = 500;break;
case "M": now = 1000;break;
}
if (prev < now && ((prev * 5) == now || (prev * 10) == now)){
now = now - (prev << 1);
}
prev = now;
sum = sum+now;
}
return sum;
}
Comparación
El switch
método de uso Map
es más rápido que el tiempo de ejecución y 1/4
el consumo de memoria es similar, como se muestra 3ms
en la figura siguiente y la estructura:swith
4ms
Map