C++不支持switch case语句中使用字符串,我知道可以通过map这种构建一一映射来实现,但是对STL容器还没有很熟,这里先用的if-else语句,比较丑,但是复杂度还行吧。
#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;
class Solution {
public:
int romanToInt(string s) {
int x = 0;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == 'I')
{
if (s[i + 1] != 'V'&&s[i+1]!='X')
{
x = x + 1;
}
else
{
x = x - 1;
}
}
else if (s[i] == 'V')
{
x = x + 5;
}
else if (s[i] == 'X')
{
if (s[i + 1]!= 'L' && s[i + 1] != 'C')
{
x = x + 10;
}
else
{
x = x - 10;
}
}
else if (s[i] == 'L')
{
x = x + 50;
}
else if (s[i] == 'C')
{
if (s[i + 1] != 'D' && s[i + 1] != 'M')
{
x = x + 100;
}
else
{
x = x - 100;
}
}
else if (s[i] == 'D')
{
x = x + 500;
}
else
{
x = x + 1000;
}
}
return x;
}
};
// 官方题解,用了map容器
class Solution1 {
private:
unordered_map<char, int> symbolValues = {
{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000},
};
public:
int romanToInt(string s) {
int ans = 0;
int n = s.length();
for (int i = 0; i < n; ++i) {
int value = symbolValues[s[i]];
if (i < n - 1 && value < symbolValues[s[i + 1]]) {
ans -= value;
}
else {
ans += value;
}
}
return ans;
}
};
int main()
{
Solution test;
string s = "LVIII";
cout << test.romanToInt(s);
}