今天的题目是罗马数字两件套

分别是

  • 整数转罗马数字

  • 罗马数字转整数

以下是题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
constexpr array<char const *, 13> roman{"M",  "CM", "D",  "CD", "C",  "XC", "L",
"XL", "X", "IX", "V", "IV", "I"};

constexpr array<int, 13> arabic{1000, 900, 500, 400, 100, 90, 50,
40, 10, 9, 5, 4, 1};

class Solution {
public:
string intToRoman(int num) {
stringstream roman_str;
int arabic_idx = 0;
while (num != 0) {
if (num >= arabic[arabic_idx]) {
roman_str << roman[arabic_idx];
num -= arabic[arabic_idx];
} else
arabic_idx++;
}
return roman_str.str();
}

int romanToInt(string s) {
int rst = 0;
for (size_t i = 0; i < s.size();) {
for (size_t j = 0; j < roman.size(); ++j) {
if (s.compare(i, strlen(roman[j]), roman[j]) == 0) {
rst += arabic[j];
i += strlen(roman[j]);
break;
}
}
}
return rst;
}
};

主要思路是将特殊情况分别打表并进行匹配