题目描述
罗马数字包含以下七种字符:I, V, X, L, C, D 和 M。每个字符对应的数值如下:
| 字符 | 数值 |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
例如:
- 罗马数字
2写作II,即两个1的并列。 - 数字
12写作XII,即X + II。 - 数字
27写作XXVII,即XX + V + II。
特殊规则
在罗马数字中,小的数字通常写在大的数字右边,但是有一些例外情况:
- 4 不写作
IIII,而是写作IV。这是因为I在V左边,表示5 - 1 = 4。 - 9 表示为
IX,表示10 - 1 = 9。 - 其他的特例还包括:
X可以放在L(50) 和C(100) 左边表示 40 和 90。C可以放在D(500) 和M(1000) 左边表示 400 和 900。
思路分析
转换罗马数字到整数的思路主要遵循以下步骤:
- 根据字符和数值的映射关系,把每个字符对应的数值取出来。
- 从左到右遍历罗马数字字符串:
- 如果某个字符对应的数值小于下一个字符的数值,说明需要用减法(如
IV表示4)。 - 否则,就把当前字符对应的数值加到结果中。
- 如果某个字符对应的数值小于下一个字符的数值,说明需要用减法(如
代码实现
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int {
unordered_map<, > map = {{, }, {, }, {, }, {, }, {, }, {, }, {, }};
ans = ;
( i = ; i < s.(); i++) {
n = map[s[i]];
(i + < s.() && map[s[i + ]] > n) {
ans -= n;
} {
ans += n;
}
}
ans;
}
};
{
Solution s;
cout << s.() << endl;
;
}


