Leetcode之13-罗马数字转整数(Roman to Integer)

前言

个人网站

公众号: 北京程序猿, 网站 : https://yaml.vip

算法题

题干

罗马数字包含以下七种字符: I, V, X, L, C, D和M。字符与数值映射关系如下。

I –> 1
V –> 5
X –> 10
L –> 50
C –> 100
D –> 500
M –> 1000

例如, 罗马数字2写做II, 即为两个并列的1。12写做XII, 即为X+II。27写做XXVII, 即为XX+V+II。

通常情况下, 罗马数字中小的数字在大的数字的右边。但也存在特例, 例如4不写做IIII,而是IV。数字1在数字5的左边,所表示的数等于大数5减 减小数1得到的数值4。同样地, 数字9表示为IX。这个特殊的规则只适用于以下六种情况:

  1. I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  2. X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  3. C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。输入确保在1到3999的范围内。

示例

示例 1:
输入: "III"
输出: 3

示例 2:
输入: "IV"
输出: 4

示例 3:
输入: "IX"
输出: 9

示例 4:
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例 5:
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示

  • If I comes before V or X, subtract 1 eg: IV = 4 and IX = 9
  • If X comes before L or C, subtract 10 eg: XL = 40 and XC = 90
  • If C comes before D or M, subtract 100 eg: CD = 400 and CM = 900

提示中的三条规则换句话讲就是如果左侧的字母代表的数字小于右侧字母代表的数字, 那么组合后的值等于右侧字母代表的数字减去左侧字母代表的数字。

Java代码

public int romanToInt(String s) {
    if (s == null || s.length() <= 0) {
        return -1;
    }
    Map<Character, Integer> mapping = new HashMap<Character, Integer>(8) {{
        put('I', 1);
        put('V', 5);
        put('X', 10);
        put('L', 50);
        put('C', 100);
        put('D', 500);
        put('M', 1000);
    }};
    final int LEN = s.length();
    int res = mapping.get(s.charAt(LEN - 1));
    for (int x = LEN - 2; x >= 0; x--) {
        if (mapping.get(s.charAt(x)) >= mapping.get(s.charAt(x + 1))) {
            res += mapping.get(s.charAt(x));
        } else {
            res -= mapping.get(s.charAt(x));
        }
    }
    return res;
}

思考题

  1. 如果将整数转换为罗马数字, 那该如何实现?

本文著作权归作者所有。

商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!

作者:北京程序猿

链接: 罗马数字转整数

    原文作者:北京程序猿
    原文地址: https://www.jianshu.com/p/1e274acd05e8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞