题目描述:
题解:
一、直接求解(时间复杂度O(n),空间复杂度O(1))
int romanToInt(string s) {
int rst = 0;
for (int i = 0; i < s.size(); i++) {
switch (s[i])
{
case 'M':rst += 1000; break;
case 'D':rst += 500; break;
case 'C':
if (i < (s.size() - 1) && (s[i + 1] == 'D' || s[i + 1] == 'M'))rst -= 100;
else rst += 100;
break;
case 'L':rst += 50; break;
case 'X':
if (i < (s.size() - 1) && (s[i + 1] == 'L' || s[i + 1] == 'C'))rst -= 10;
else rst += 10;
break;
case 'V':rst += 5; break;
case 'I':
if (i < (s.size() - 1) && (s[i + 1] == 'V' || s[i + 1] == 'X'))rst -= 1;
else rst += 1;
break;
default:
break;
}
}
return rst;
}
二、哈希表(时间复杂度O(n),空间复杂度O(1))
问题规模小,使用hash map略显多余。
int romanToInt(string s) {
unordered_map<char, int> mp;
mp['I'] = 1;
mp['V'] = 5;
mp['X'] = 10;
mp['L'] = 50;
mp['C'] = 100;
mp['D'] = 500;
mp['M'] = 1000;
int pos = 0, neg = 0;
for (int i = 0; i < s.size() - 1; ++i) {
if (mp[s[i]] < mp[s[i + 1]])
neg -= mp[s[i]];
else
pos += mp[s[i]];
}
pos += mp[s.back()];
return pos + neg;
}