LeetCode热题(JS版)- 13. 罗马数字转整数

91 阅读1分钟

题目

罗马数字由七种不同的符号表示: IVXLCD and 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。

罗马数字通常从左到右从大到小书写。然而,四的数字不是IIII。相反,数字4被写为IV。因为1在5之前,所以我们将其减为4。同样的原理也适用于数字九,即九。有六种情况下使用减法:

我可以放在V(5)和X(10)之前,得到4和9。

X可以放在L(50)和C(100)之前,以形成40和90。

C可以放在D(500)和M(1000)之前,以形成400和900。

给定一个罗马数字,将其转换为整数。

示例 1:

输入: s = "III"
输出: 3
说明: III = 3.

示例 2:

输入: s = "LVIII"
输出: 58
说明: L = 50, V= 5, III = 3.

示例 3:

输入: s = "MCMXCIV"
输出: 1994
说明: M = 1000, CM = 900, XC = 90 and IV = 4.

思路

  • 从头往后扫描。如果是低位 + 高位 则合成一个,用高位 - 低位。 否则 累加
function romanToInt(s: string): number {
  const symbols = ['I', 'V', 'X', 'L', 'C', 'D', 'M'];
  const values = [1, 5, 10, 50, 100, 500, 1000];
  const indexs = symbols.reduce((obj, curr, i) => {
    obj[curr] = i;
    return obj;
  }, {});

  let sum = 0;
  for (let i = 0; i < s.length; i++) {
    const symbol1 = s[i];
    const symbol2 = s[i + 1];
    const index1 = indexs[symbol1];
    const index2 = indexs[symbol2];

    if (!symbol2 || index1 >= index2) {
      sum += values[index1];
    } else {
      sum += values[index2] - values[index1];
      i++;
    }
  }

  return sum;
}

image.png