关键在于做出一个罗马字母与数字的键值对,并对6种特殊情况进行单独分析(可以采用类似于编译原理“向后看一位”的方法)
C语言版本:
int GetValue(char c)
{
if(c=='I')
return 1;
if(c=='V')
return 5;
if(c=='X')
return 10;
if(c=='L')
return 50;
if(c=='C')
return 100;
if(c=='D')
return 500;
if(c=='M')
return 1000;
return 0;
}
int romanToInt(char* s) {
int sum=0;
char c=*s;
while(*s!=0)
{
if(*(s+1)==0 || GetValue(*s)>=GetValue(*(s+1))){sum=sum+GetValue(*s);s++;}
else{sum=sum+GetValue(*(s+1))-GetValue(*s);s=s+2;}
}
return sum;
}
C++版本(直接用map实现键值对):
class Solution {
public:
int romanToInt(string s) {
map<char, int> mp;
int i,n,prev,curr,ans;
mp.insert(map<char,int> :: value_type('I', 1));
mp.insert(map<char,int> :: value_type('V', 5));
mp.insert(map<char,int> :: value_type('X', 10));
mp.insert(map<char,int> :: value_type('L', 50));
mp.insert(map<char,int> :: value_type('C', 100));
mp.insert(map<char,int> :: value_type('D', 500));
mp.insert(map<char,int> :: value_type('M', 1000));
n=s.size();
ans=mp[s[0]];
for(i=1;i<n;i++)
{
prev=mp[s[i-1]];
curr=mp[s[i]];
if(prev<curr)
ans=ans-prev+(curr-prev);
else
ans+=curr;
}
return ans;
}
};