leetcode-13-easy

Roman to Integer
思路一: 暴力求解,遍历字符,遇到 6 种特殊的组合字符单独计算

    static Map<Character, Integer> map = new HashMap<>();
    static Map<String, Integer> combine = new HashMap<>();
    static {
        map.put('I', 1);
        map.put('V', 5);
        map.put('X', 10);
        map.put('L', 50);
        map.put('C', 100);
        map.put('D', 500);
        map.put('M', 1000);
        combine.put("IV", 4);
        combine.put("IX", 9);
        combine.put("XL", 40);
        combine.put("XC", 90);
        combine.put("CD", 400);
        combine.put("CM", 900);
    }

    public static int romanToInt(String s) {
        char[] chars = s.toCharArray();
        int result = 0;
        for (int i = 0; i < chars.length; i++) {
            if ((chars[i] == 'I' || chars[i] == 'X' || chars[i] == 'C') && (i + 1) < chars.length) {
                String key = new String(new char[]{chars[i], chars[i + 1]});
                if (combine.containsKey(key)) {
                    result += combine.get(key);
                    i++;
                } else {
                    result += map.get(chars[i]);
                }
            } else {
                result += map.get(chars[i]);
            }
        }

        return result;
    }

思路二: 更巧妙的思路,不要把 6 种特殊的情况的字符组合起来,还是按照单独字符看,只不过 6 种特殊情况都是小在大的左边,则小的变成负数

public static int romanToInt(String s) {
    int result = 0;
    int pre = map.get(s.charAt(0));

    char[] arr = s.toCharArray();
    for (int i = 1; i < arr.length; i++) {
        char c = arr[i];
        if (pre < map.get(c)) {
            result -= pre;
        } else {
            result += pre;
        }
        pre = map.get(c);
    }

    return result + pre;
}

思路三: 更容易理解的思路,把 6 种特殊情况下的组合字符都用 6 个单独的字符替换,map 增加 6 新字符对应的值,依次遍历求解

public int romanToInt(String s) {
    s = s.replace("IV","a");
    s = s.replace("IX","b");
    s = s.replace("XL","c");
    s = s.replace("XC","d");
    s = s.replace("CD","e");
    s = s.replace("CM","f");
    
    int result = 0;
    for (int i=0; i<s.length(); i++) {
        result += which(s.charAt(i));
    }
    return result;
}

public int which(char ch) {
    switch(ch) {
        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;
        case 'a': return 4;
        case 'b': return 9;
        case 'c': return 40;
        case 'd': return 90;
        case 'e': return 400;
        case 'f': return 900;
    }
    return 0;
}
posted @ 2022-10-09 17:15  iyiluo  阅读(18)  评论(0)    收藏  举报