目录
原题传送门
题解
首先,这一整个就是二叉树的感觉呀。
- 对于罗马数字:
I
,V
,X
,L
,C
,D
和M,定义数组romans[]{...}
- 当且仅当只存在 I 时,I 才会是树根,且绝不会有左叶子。
- 从最大树根候选开始查看是否存在左叶子;
- ..
或者,看成运算符定义,每一个罗马数的符号(±)由其下一位决定,最后一位为正;
class Solution {
public:
int romanToInt(string s) {
int value{};
for (size_t i = 0; i < s.size(); i++)
{
switch (s[i])
{
case 'I':
value += (s[i + 1] == 'V' || s[i + 1] == 'X') ? -1 : 1;
break;
case 'V':
value += 5;
break;
case 'X':
value += (s[i + 1] == 'L' || s[i + 1] == 'C') ? -10: 10;
break;
case 'L':
value += 50;
break;
case 'C':
value += (s[i + 1] == 'D' || s[i + 1] == 'M') ? -100 : 100;
break;
case 'D':
value += 500;
break;
case 'M':
value += 1000;
break;
default: break;
}
}
return value;
}
};
或者,穷举所有可能,分两种情况,含左叶子的2个字符和单个字符,整理成哈希表
map<string, int> romanChoices
{
{"I",1},
{"V",5},
{"X",10},
{"L",50},
{"C",100},
{"D",500},
{"M",1000},
{"IV",4},
{"IX",9},
{"XL",40},
{"XC",90},
{"CD",400},
{"CM",900}
};