返回

前端Leetcode系列|13. 罗马数字转整数,用代码解题!

前端

罗马数字转整数

罗马数字包含以下七种字符:

  • I、V、X、L、C、D 和 M
  • 例如,罗马数字 2 写做 II,即为两个并列的 1
  • 12 写做 XII,即为 X + II = 10 + 2 = 12
  • 21 写做 XXI,即为 XX + I = 20 + 1 = 21

算法步骤:

  1. 从左到右遍历罗马数字字符串。
  2. 将每个罗马数字字符转换为相应的数字。
  3. 将转换后的数字累加到结果中。
  4. 如果当前罗马数字字符比上一个罗马数字字符大,则将上一个罗马数字字符的数字值减去 2 倍。
  5. 重复步骤 1-4,直到遍历完整个罗马数字字符串。

示例:

输入:III
输出:3

解释:III = 1 + 1 + 1 = 3
输入:LVIII
输出:58

解释:LVIII = 50 + 5 + 3 = 58
输入:MCMXCIV
输出:1994

解释:MCMXCIV = 1000 + 900 + 90 + 4 = 1994

代码实现:

/*
 * @param {string} s 罗马数字字符串
 * @return {number} 整数
 */
const romanToInt = (s) => {
  const romanMap = {
    'I': 1,
    'V': 5,
    'X': 10,
    'L': 50,
    'C': 100,
    'D': 500,
    'M': 1000
  };

  let result = 0;
  let prev = 0;

  for (let i = s.length - 1; i >= 0; i--) {
    const curr = romanMap[s[i]];
    if (curr < prev) {
      result -= curr;
    } else {
      result += curr;
    }
    prev = curr;
  }

  return result;
};
def roman_to_int(s):
    roman_map = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    }

    result = 0
    prev = 0

    for i in range(len(s) - 1, -1, -1):
        curr = roman_map[s[i]]
        if curr < prev:
            result -= curr
        else:
            result += curr
        prev = curr

    return result
class Solution {
    public int romanToInt(String s) {
        int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

        int result = 0;
        for (int i = 0; i < values.length; i++) {
            while (s.startsWith(symbols[i])) {
                result += values[i];
                s = s.substring(symbols[i].length());
            }
        }

        return result;
    }
}

总结:

在本文中,我们详细介绍了如何将罗马数字转换为整数。我们从算法步骤开始,然后提供了示例和代码实现。希望这些内容对您有所帮助。如果您有任何问题,请随时留言。