解法一
思路
- 将字符串中所用罗马数字转为对应整数后,再相加
- 寻找字符串中的6种特殊情况,减去多计算的部分
class Solution {
public:
int romanToInt(string s) {
int n = s.length();
int sum = 0;
for(int i = 0; i < n; i++) {
if(s[i] == 'I') sum += 1;
else if(s[i] == 'V') sum += 5;
else if(s[i] == 'X') sum += 10;
else if(s[i] == 'L') sum += 50;
else if(s[i] == 'C') sum += 100;
else if(s[i] == 'D') sum += 500;
else if(s[i] == 'M') sum += 1000;
}
cout << sum << endl;
for(int i = 0; i < n; i++) {
if(s[i] == 'I' && (s[i + 1] == 'V' || s[i + 1] == 'X')) sum -= 2;
else if(s[i] == 'X' && (s[i + 1] == 'L' || s[i + 1] == 'C')) sum -= 20;
else if(s[i] == 'C' && (s[i + 1] == 'D' || s[i + 1] == 'M')) sum -= 200;
}
return sum;
}
};
解法二:哈希表
class Solution {
public:
int romanToInt(string s) {
unordered_map<char, int> hash;
hash['I'] = 1, hash['V'] = 5;
hash['X'] = 10, hash['L'] = 50;
hash['C'] = 100, hash['D'] = 500;
hash['M'] = 1000;
int sum = 0;
int n = s.length();
for(int i = 0; i < n; i++) {
if(i + 1 < n && hash[s[i]] < hash[s[i + 1]])
sum -= hash[s[i]];
else
sum += hash[s[i]];
}
return sum;
}
};