主題の要件
元の質問へのリンク
(1つの質問、2つの質問、私は専門家に直接電話します)
コード:特殊文字に遭遇したときは、もう1つ楽しみにしてください
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;
}
};
全体のアイデア
まず、マップを作成し、ローマ字とそれに対応する整数をマップに格納します。
次に、文字列内の文字を左から右に少しずつスキャンします。
- 「I」、「X」、「C」の3つの文字に遭遇した場合、2つのローマ字が数字を表すかどうかを判断するために、境界を越えないようにすることに基づいて、もう1ビット楽しみにしてください。mapを使用して対応する値をクエリし、それを合計変数に追加します。
- 他のキャラクターに遭遇した場合は、mapを直接使用して対応する値を照会します。それをsum変数に追加します。
結果
地図で大騒ぎしましたか...