题目要求
原题链接
(一题两出,我直呼内行)
代码:遇到特殊字符向前多看一位
class Solution {
public:
map<string, int> m;
int romanToInt(string s) {
int index = 0, num = 0;
string temp;
mapInit();
while (index < s.size())
{
switch (s[index])
{
case 'I':
if (index+1 < s.size() && s[index + 1] == 'V')
{
num += m["IV"];
index += 2;
}
else if (index + 1 < s.size() && s[index + 1] == 'X')
{
num += m["IX"];
index += 2;
}
else
{
num += m["I"];
++index;
}
break;
case 'X':
if (index + 1 < s.size() && s[index + 1] == 'L')
{
num += m["XL"];
index += 2;
}
else if (index + 1 < s.size() && s[index + 1] == 'C')
{
num += m["XC"];
index += 2;
}
else
{
num += m["X"];
++index;
}
break;
case 'C':
if (index + 1 < s.size() && s[index + 1] == 'D')
{
num += m["CD"];
index += 2;
}
else if (index + 1 < s.size() && s[index + 1] == 'M')
{
num += m["CM"];
index += 2;
}
else
{
num += m["C"];
++index;
}
break;
default:
temp = s[index];
num += m[temp];
++index;
break;
}
}
return num;
}
void mapInit()
{
m["I"] = 1;
m["IV"] = 4;
m["V"] = 5;
m["IX"] = 9;
m["X"] = 10;
m["XL"] = 40;
m["L"] = 50;
m["XC"] = 90;
m["C"] = 100;
m["CD"] = 400;
m["D"] = 500;
m["CM"] = 900;
m["M"] = 1000;
}
};
整体思路
首先先建立一个map,将罗马字符以及与之相对应的整数存入map之中。
接着从左到右逐位扫描字符串中的字符:
- 当遇到‘I’、‘X’、‘C’这三个字符时,在保证不越界的基础上往前多看一位,确定是否碰到两位罗马字符表示一位数字的情况。利用map查询相应数值并将其加到求和变量中。
- 当遇到其它字符时,直接利用map查询与之对应的数值。将其加到求和变量中。
结果
用map是不是小题大做了…