当前位置: 面试刷题>> 罗马数字转整数(经典算法150题)
### 题目描述
罗马数字是古罗马使用的一种数字系统,它采用不同的符号来表示不同的数值,例如 `I` 表示 1,`V` 表示 5,`X` 表示 10,`L` 表示 50,`C` 表示 100,`D` 表示 500,`M` 表示 1000。罗马数字遵循从左到右的读取规则,但是有一个例外,当较小的数字在较大的数字左边时,表示从较大的数字中减去较小的数字。例如,`IV` 表示 4,`VI` 表示 6,而 `IX` 表示 9。
给定一个罗马数字,将其转换成整数。请编写一个函数来实现这一转换,并在 PHP、Python 和 JavaScript 中分别给出示例代码。
### PHP 示例代码
```php
function romanToInt($roman) {
$map = ['I' => 1, 'V' => 5, 'X' => 10, 'L' => 50, 'C' => 100, 'D' => 500, 'M' => 1000];
$result = 0;
$n = strlen($roman);
for ($i = 0; $i < $n - 1; $i++) {
$value = $map[$roman[$i]];
$nextValue = $map[$roman[$i + 1]];
if ($value < $nextValue) {
$result -= $value;
} else {
$result += $value;
}
}
// 添加最后一个字符的值,因为它没有下一个字符进行比较
$result += $map[$roman[$n - 1]];
return $result;
}
// 示例
echo romanToInt("MCMXCIV"); // 输出 1994
```
### Python 示例代码
```python
def romanToInt(s: str) -> int:
map = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
result = 0
n = len(s)
for i in range(n - 1):
value = map[s[i]]
next_value = map[s[i + 1]]
if value < next_value:
result -= value
else:
result += value
# 加上最后一个字符的值
result += map[s[n - 1]]
return result
# 示例
print(romanToInt("MCMXCIV")) # 输出 1994
```
### JavaScript 示例代码
```javascript
function romanToInt(s) {
const map = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000};
let result = 0;
for (let i = 0; i < s.length - 1; i++) {
let value = map[s[i]];
let nextValue = map[s[i + 1]];
if (value < nextValue) {
result -= value;
} else {
result += value;
}
}
// 加上最后一个字符的值
result += map[s[s.length - 1]];
return result;
}
// 示例
console.log(romanToInt("MCMXCIV")); // 输出 1994
```
在以上代码中,我们使用了哈希表(在 PHP 中是关联数组,Python 和 JavaScript 中是对象)来存储罗马数字到整数的映射,并通过遍历字符串中的每个字符来计算其对应的整数值。在遍历过程中,我们需要特别注意处理特殊情况,即当较小的数字在较大的数字左边时,应从较大的数字中减去较小的数字。最后,我们将计算得到的整数值返回作为结果。