当前位置: 面试刷题>> 罗马数字转整数(经典算法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 示例代码

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 示例代码

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 示例代码

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 中是对象)来存储罗马数字到整数的映射,并通过遍历字符串中的每个字符来计算其对应的整数值。在遍历过程中,我们需要特别注意处理特殊情况,即当较小的数字在较大的数字左边时,应从较大的数字中减去较小的数字。最后,我们将计算得到的整数值返回作为结果。

推荐面试题