题目要求
将罗马数字转换为整数,其中罗马数字有7种“Ⅰ,V, X, L, C, D, M”,含义属下表所示:
Ⅱ: 表示两个Ⅰ相加(1+1=2)
XⅡ: 表示X 和Ⅱ相加(10+2 = 12)
需要注意的是!!!
罗马数字在书写时遵循着从左到右是数值递增(就是右边的数会比左边的大,如XV)的顺序,然而有一些情况是左边的数会小于右边的数,如 Ⅳ,那么这时不再用相加去计算,而是用减法,即 V-Ⅰ = 5-1=4.
在罗马数字中共有六种特殊情况,具体内容看一下这个规则:
(1)当Ⅰ在V,X左边时,分别表示4(Ⅳ),9(Ⅸ)
(2)当 X 在L,C左边时,分别表示40(XL),90(XC)
(3)当 C在D,M左边时,分别表示400(CD),900(CM)
输入实例
Input :“Ⅲ”
Output:3
Input :“Ⅳ”
Output:4
Input :"Ⅸ“
Output:9
Input: “LVIII”
Output: 58
Input: “MCMXCIV”
Output: 1994
思路 :
我们对输入的字符串进行遍历,看当前遍历的字符属于Ⅰ,V, X, L, C, D, M,那类,根据类别找到其对应的值即可。需要处理的特殊情况有上面规则中出现的六种,我们只需要在判断类别后,再对是否属于特殊情况进行判断即可,所以我们选用switch进行操作。
主要代码 ( C++ ):
// leetcode 013
// roman to Integer
class Solution{
class Solution{
public:
int romanToInt(string s){
int sum = 0;
for(int i=0;i<s.size();i++){
switch(s[i]){
case 'M':sum+=1000; break;
case 'D':sum+=500;break;
case 'C':
//一定要用==去判断,
//!=判断条件为真就执行的话会报错。
if(s[i+1] =='M' || s[i+1] == 'D') sum-=100;
else sum+=100;
break;
case 'L':sum+=50;break;
case 'X':
if(s[i+1] =='C' || s[i+1] == 'L') sum-=10;
else sum+=10;
break;
case 'V':sum+=5; break;
case'I':
if(s[i+1] =='V' || s[i+1] == 'X') sum-=1;
else sum+=1;
break;
}
}
return sum;
}
};