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

算法题

题干

罗马数字包含以下七种字符: 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
示例 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代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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. 如果将整数转换为罗马数字, 那该如何实现?
如果有任何错误或疑问, 欢迎小伙伴们评论区留言^-^
( 完 )

欢迎各位看官关注

麻辣烫,走起
0%