LeetCode-13 罗马数字转整数
2019-05-27 本文已影响0人
编程半岛
- 题目:13. 罗马数字转整数
- 难度:简单
- 分类:字符串、数学
- 解决方案:字符串遍历
今天我们学习第13题罗马数字转整数,这是一道简单题,这是我们昨天学习的eetCode-12 整数转罗马数字的逆过程。下面我们看看这道题的题目描述。
题目描述
罗马数字包含以下七种字符: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
。这个特殊的规则只适用于以下六种情况:
-
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进行详细分析,过程如下图所示:
示例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;
}
}
提交结果