这道题本来很简单,可是需要注意的是从细节上进行性能改进。一开始我是用Map来存储罗马字母和数字的对应关系,结果发现性能比较差。而改为switch,并且将之写成子函数,并将函数设置Inline,性能得到改进。
因此,如果需要建立映射关系的时候,如果映射的组数比较少的时候,应该尝试使用switch来建立映射关系。如果子函数较小,且被频繁调用,那么应该将该函数设置为inline。这样函数代码会内嵌到代码中,免除了函数调用的开销。
代码:
class Solution {
inline int romanCharToInt(char c) {
switch (c) {
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;
}
}
public:
int romanToInt(string s) {
/*
map<char,int> m;
m['I'] = 1;
m['V'] = 5;
m['X'] = 10;
m['L'] = 50;
m['C'] = 100;
m['D'] = 500;
m['M'] = 1000;
*/
int sum = 0;
for(int i = ((int)s.length() - 1); i >= 0; i--)
{
if(i + 1 == (int)s.length())
sum += romanCharToInt(s[i]);
else
{
int t = romanCharToInt(s[i]);
if(t < romanCharToInt(s[i + 1]))
{
sum -= t;
}
else
sum += t;
}
}
return sum;
}
};