题目
Given a roman numeral,convert it to an integer.
Input is guaranteed to bewithin the range from 1 to 3999.
给罗马数字求数字,
依次获取每个罗马数字位的字符,查表。
代码:
string c1[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"};
char c2[9]={'I','V','X','L','C','D','M',' ',' '}; //字符表
class Solution {
public:
int romanToInt(string s) {
int ans=0;
string temp; //一位罗马数字
int radix=1000;
int c2begin=6,c2end=9; //每位可取字符头尾
int i,j,k=0,q=0;
for(i=3;i>=0;i--) //由高位至低位
{
temp.clear();
j=c2begin;
while(j<c2end&&k<s.size()) //取字符,直到取完相应罗马位
{
for(j=c2begin;j<c2end;j++)
{
if(s[k]==c2[j])
{
temp+=c2[j];
k++;
break;
}
}
}
for(q=0;q<10;q++) //转换相应罗马位
{
if(temp==c1[i][q])
{
ans+=radix*q;
break;
}
}
c2begin-=2;
c2end-=2;
radix/=10;
if(k>=s.size())
break;
}
return ans;
}
};
不按位查表:
char c2[9]={'I','V','X','L','C','D','M',' ',' '}; //字符表
class Solution {
public:
int romanToInt(string s) {
int ans=0;
int temp; //每位转换值
int flag; //正负标记
int radix=1000;
int c2begin=6; //每罗马位字符开始位置
int k=0;
for(int i=3;i>=0;i--) //由高位至低位
{
temp=0;
flag=-1;
while(k<s.size()) //取字符,直到取完相应罗马位
{
if(s[k]==c2[c2begin])
{
temp+=flag;
k++;
}
else if(s[k]==c2[c2begin+1])
{
temp+=5;
flag=1;
k++;
}
else if(s[k]==c2[c2begin+2])
{
temp+=10;
flag=1;
k++;
}
else
break;
}
ans+=abs(temp)*radix;
c2begin-=2;
radix/=10;
if(k>=s.size())
break;
}
return ans;
}
};