Conversión de números romanos a números enteros (13) Solución

tema

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

personaje valor
I 1
V 5
X 10
l 50
C 100
D 500
METRO 1000

Por ejemplo, los números romanos 2se escriben como II, es decir, dos yuxtapuestos 1. 12Se escribe XIIcomo X+ II. Está 27escrito XXVIIcomo XX++ .VII

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 4no escribir como IIII, sino IV. El número 1está en 5el lado izquierdo del número y el número representado es igual al valor obtenido 5al reducir el número del número grande . Asimismo, los números se representan como .1 49IX

Esta regla particular se aplica sólo a las siguientes seis situaciones:

  • ISe puede colocar a la izquierda de V(5) y X(10) para representar 4 y 9.
  • XSe puede colocar a la izquierda de L(50) y C(100) para representar 40 y 90.
  • CSe 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.

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 mcomo 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+mcumple con las seis situaciones, y las características comunes de las seis situaciones son mny veces, en este caso ( = )510(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 Mapestructuras o swithjuicios swithpara hacer que los juicios sean más eficientes y consuman menos memoria. MapEl 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 switchmétodo de uso Mapes más rápido que el tiempo de ejecución y 1/4el consumo de memoria es similar, como se muestra 3msen la figura siguiente y la estructura:swith4msMap
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/AnNanDu/article/details/126662058
Recomendado
Clasificación