题目:Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
解题思路:罗马数字的构成规则是:
-
相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
-
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
-
小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数。
所以解题的时候,我们就一直加,加到出现左边这个数字比右边这个数字小的时候,再减去他。因为之前加过他一次,所以减去的时候,需要减去两次。
代码为:
class Solution {
public:
int romanToInt(string s) {
int slen = s.length();
if(slen <= 0)
return 0;
char s_copy[slen + 1];
strncpy(s_copy,s.c_str(),slen);
int res = todigit(s_copy[0]);
for(int i = 1;i < slen; i++)
{
if(todigit(s_copy[i - 1]) < todigit(s_copy[i]))
{
res += todigit(s_copy[i]) - 2 * todigit(s_copy[i - 1]) ;
}
else
{
res += todigit(s_copy[i]);
}
}
return res;
}
int todigit(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;
}
return 0;
}
};