[Solución de algoritmo] LeetCode 13. Números romanos a enteros

tema

Los números romanos contienen los siguientes siete caracteres: I, V, X, L, C, D y M.
El 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, lo que significa dos paralelos.El 12 se escribe como XII, lo que significa X + II. 27 se escribe XXVII, que es XX + V + II.

Normalmente, el número pequeño en números romanos está a la derecha del número grande. Pero hay casos especiales, por ejemplo, 4 no se escribe como IIII, sino como IV. El número 1 está a la izquierda del número 5, y el número representado es igual al número 4 obtenido al restar el número 1 del número grande 5. Del mismo modo, el número 9 se representa como IX. Esta regla especial solo se aplica a las siguientes seis situaciones:

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 en un número entero. Asegúrese de que la entrada esté en el rango de 1 a 3999.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/roman-to-integer

Solucion uno

Además de los 7 números de un solo carácter, hay 6 números de doble carácter. Mantenga estas 13 situaciones en un mapa. Para recorrer los números romanos, primero juzgue en el mapa basándose en dos caracteres, si no, juzgue basándose en un carácter.

class Solution {
    public int romanToInt(String s) {
        Map<String,Integer> numMap = new HashMap<String,Integer>(16);
        numMap.put("M",1000);
        numMap.put("CM",900);
        numMap.put("D",500);
        numMap.put("CD",400);
        numMap.put("C",100);
        numMap.put("XC",90);
        numMap.put("L",50);
        numMap.put("XL",40);
        numMap.put("X",10);
        numMap.put("IX",9);
        numMap.put("V",5);
        numMap.put("IV",4);
        numMap.put("I",1);

        int result = 0;
        for(int i = 0; i < s.length(); i++) {
            if(i < s.length() -1 && numMap.containsKey(s.substring(i,i + 2))) {
                result += numMap.get(s.substring(i,i + 2));
                i++;
            } else {
                result += numMap.get(s.substring(i,i + 1));
            }
        }
        return result;
    }
}

Solución dos

Juzgue carácter por carácter y sume cada resultado. Si el carácter anterior es más pequeño que el carácter actual, significa que el carácter anterior se ha agregado dos veces y el número del código de carácter anterior debe restarse dos veces.

class Solution {
    public int romanToInt(String s) {
        int result = 0,prev = 1001;
        for(int i = 0; i < s.length(); i++) {
            int num = getValue(s.charAt(i));
            result += num;
            if(num > prev) {
                result -= 2 * prev;
            }
            prev = num;
        }
        return result;
    }

    public int getValue(char c) {
        switch (c) {
            case 'I': return 1;
            case 'V': return 5;
            case 'X': return 10;
            case 'L': return 50;
            case 'C': return 100;
            case 'D': return 500;
            case 'M': return 1000;
        }
        return 0;
    }
}

Supongo que te gusta

Origin blog.csdn.net/vxzhg/article/details/106673540
Recomendado
Clasificación