LeetCode 13. 罗马数字转整数

636 阅读1分钟

leetcode-cn.com/problems/ro…

思路:和上一题的逆运算,构造一个映射,遍历字符串,如果映射不到回退上一个key

public int romanToInt(String s) {
    // 考虑边界
    if (s == null || s.length() == 0) {
        return 0;
    }

    Map<String, Integer> map = new HashMap<>();
    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);
    // 特殊情况
    map.put("IV", 4);
    map.put("IX", 9);
    map.put("XL", 40);
    map.put("XC", 90);
    map.put("CD", 400);
    map.put("CM", 900);

    // MCMXCIV
    int result = 0;
    String cur = String.valueOf(s.charAt(0));
    for (int i = 1; i < s.length(); i++) {
        String tmp = cur + String.valueOf(s.charAt(i));
        if (map.containsKey(tmp)) {
            cur = tmp;
        } else {
            result += map.get(cur);
            cur = String.valueOf(s.charAt(i));
        }
    }
    result += map.get(cur);
    return result;
}