Problem Description:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
分析:题目的意思是将罗马数字转化成整数,首先是在网上找到关于罗马数字表示法的规则如下:1、计数方法:① 罗马数字就有下面七个基本符号:Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、L(50)、C(100)、D(500)、M(1000)。
② 相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;XX=20;CC=200;MMM=3000;
③ 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
④ 小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
⑤ 正常使用时连写的数字重复不得超过三次;
2、组数规则: ① 基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
② 不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目;
③ V 和X 左边的小数字只能用Ⅰ。
④ L 和C 左边的小数字只能用X。
⑤ D 和M 左边的小数字只能用C。
还有一些规则是当整数大于3999时需要考虑的,这个题目就不用考虑了。依照上述规则,可以看出罗马数字计数法转化成整数时如果当前的数字temp小于等于左边的数字last,则直接相加;否则应该加上temp-2*last;按照这一规则,写出转化代码如下:
class Solution {
public:
int rtoi(char ch)
{
switch(ch){
case 'I':return 1;
case 'V':return 5;
case 'X':return 10;
case 'L':return 50;
case 'C':return 100;
case 'D':return 500;
case 'M':return 1000;
default:return 0;
}
}
int romanToInt(string s) {
int res=0;
if(s.empty())
return 0;
int temp,last;
temp=rtoi(s[0]);
last=temp;
res+=last;
for(int i=1;i<s.size();++i)
{
temp=rtoi(s[i]);
if(temp<=last)
res+=temp;
else
res+=temp-2*last;
last=temp;
}
return res;
}
};