题目描述
给你一个字符串s,s中只包含字符串罗马数字。
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
通常情况下,罗马数字中小的数字在大的数字的右边。
特殊情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
解题思路
枚举即可,枚举的时候要注意特殊情况的判断。
即在可以出现特殊情况的字符中,向下一位字符判断一下。
代码
class Solution { public: int romanToInt(string s) { unordered_map<string,int> hash(13); //枚举 hash["I"]=1;hash["V"]=5;hash["X"]=10;hash["L"]=50;hash["C"]=100;hash["D"]=500;hash["M"]=1000; hash["IV"]=4;hash["IX"]=9;hash["XL"]=40;hash["XC"]=90;hash["CD"]=400;hash["CM"]=900; int sum=0; for(int i=0;i<s.size();i++) { string str; str+=s[i]; //特殊情况判断一下 if((s[i]=='I'||s[i]=='X'||s[i]=='C')&&i+1<s.size()&&hash.count(str+s[i+1])) { i++; str+=s[i]; } sum+=hash[str]; } return sum; } };