题目:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
Solution(1)
我的答案,读取每个罗马数字,最多4个。
比较长,但好理解。
int romanToInt(string s)
{
int i = 0;
int n = s.size();
string roman[4][10] = {
{"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
{"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
{"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
{"M", "MM", "MMM"}
};
string str[4] = {""};
while(i<n)
{
if(s[i] == 'M')
{
if(i>0 && s[i-1] == 'C')
{
str[2] += 'M';
}
else
str[3] += 'M';
}
else if(s[i] == 'C' || s[i] == 'D')
{
if(i>0 && s[i-1] == 'X')
{
str[1] += 'C';
}
else
str[2] += s[i];
}
else if(s[i] == 'X' || s[i] == 'L')
{
if(i>0 && s[i-1] == 'I')
{
str[0] += 'X';
}
else
str[1] += s[i];
}
else if(s[i] == 'I' || s[i] == 'V')
{
str[0] += s[i];
}
i++;
}
int base[4] = {1,10,100,1000};
int result = 0;
for(int i=3;i>=0;i--)
{
for(int j = 0;j<10;j++)
{
if(roman[i][j] == str[i] && str[i] != "")
{
result += base[i] *(j+1);
}
}
}
return result;
}
Solution(2):
补充另一种解法,网上很多介绍:
int getRealNumber(char x)
{
switch(x)
{
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 n = s.size();
int result = 0;
int pre_number = getRealNumber(s[0]);
int number = 0;
int sub = pre_number;
for(int i=1;i<n;i++)
{
number = getRealNumber(s[i]);
if(pre_number < number)
sub = number - sub;
else if(pre_number > number)
{
result += sub;
sub = number;
}
else
sub += number;
pre_number = number;
}
result += sub;
return result;
}