> 题目:13. 罗马数字转整数
> 难度:简单
> 分类:字符串、数学
> 解决方案:字符串遍历
今天我们学习第13题罗马数字转整数,这是一道简单题,是我们昨天学习的LeetCode-12 整数转罗马数字(点击跳转)的逆过程。下面我们看看这道题的题目描述。
罗马数字包含以下七种字符: I
, V
, X
, L
, C
, D
和 M
。
字符 数值I 1V 5X 10L 50C 100D 500M 1000
例如,罗马数字 2
写做 II
,即为两个并列的 1
。 12
写做 XII
,即为 X+II
。 27
写做 XXVII
, 即为 XX+V+II
。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4
不写做 IIII
,而是 IV
。数字 1
在数字 5
的左边,所表示的数等于大数 5
减小数 1
得到的数值 4
。同样地,数字 9
表示为 IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在 V(5)
和 X(10)
的左边,来表示 4
和 9
。X
可以放在 L(50)
和 C(100)
的左边,来表示 40
和 90
。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.
题目要求我们将一个罗马数转为整数数,并给出了罗马数与整数的对应规则,如下图所示。
根据题目可以归纳出罗马数的基本组成规则:
II=2
XII=12
Ⅰ
、 X
和 C
)在大的数字的左边,所表示的数等于大数减小数得到的数,如: Ⅳ=4
根据上面规则可以知道,对于一个给定的罗马数来说,我们可以从左到右遍历这个字符串并统计 I
, V
, X
, L
, C
, D
和 M
这七个字符出现的次数。统计时需要注意:
I
字符如果后面为 V
或者 X
则 I
出现的次数减一,否则 I
字符出现次数加一;X
字符如果后面为 L
或者 C
则 X
出现的次数减一,否则 X
字符出现次数加一;C
字符如果后面为 D
或者 M
则 C
出现的次数减一,否则 C
字符出现次数加一;对示例5进行详细分析,过程如下图所示:
java
代码如下所示:
class Solution { public int romanToInt(String s) { // 初始化七种字符出现的次数为0 int I = 0, V = 0, X = 0, L = 0, C = 0, D = 0, M = 0;
// 遍历字符串,统计每种字符串出现的次数 for(int i=0; i<s.length(); i++){ if(s.charAt(i) == 'I'){ if(i+1<s.length() && (s.charAt(i+1) == 'V' || s.charAt(i+1) == 'X')) I--; else I++; }else if(s.charAt(i) == 'V'){ V++; }else if(s.charAt(i) == 'X'){ if(i+1<s.length() && (s.charAt(i+1) == 'L' || s.charAt(i+1) == 'C')) X--; else X++; }else if(s.charAt(i) == 'L'){ L++; }else if(s.charAt(i) == 'C'){ if(i+1<s.length() && (s.charAt(i+1) == 'D' || s.charAt(i+1) == 'M')) C--; else C++; }else if(s.charAt(i) == 'D'){ D++; }else if(s.charAt(i) == 'M'){ M++; } }
return I + V*5 + X*10 + L*50 + C*100 + D*500 + M*1000; }}
LeetCode-13 罗马数字转整数:https://github.com/JacobLei/leetcode/blob/master/src/main/java/A13_RomantoInteger.java
13.罗马数字转整数:https://leetcode-cn.com/problems/roman-to-integer/