leetcode:整数转罗马数字

2021-09-24  本文已影响0人  隔壁老王z

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。


例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。

较好的解法:贪心算法,尽可能优先使用较大数值对应的字符,就像购物时找零钱尽可能找大些的面额。本题中,将哈希表按照从大到小的顺序排列,然后遍历哈希表,直到表示完整个输入。

/**
 * @param {number} num
 * @return {string}
 */
var intToRoman = function(num) {
    const valueSymbols = [[1000, "M"], [900, "CM"], [500, "D"], [400, "CD"], [100, "C"], [90, "XC"], [50, "L"], [40, "XL"], [10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]];
    const roman = [];
    for (const [value, symbol] of valueSymbols) {
      debugger
      while (num >= value) {
          num -= value;
          roman.push(symbol);
      }
      if (num == 0) {
          break;
      }
    }
    return roman.join('');
};

比较笨的解法,遍历个十百千每一位,根据情况分别处理:

/**
 * @param {number} num
 * @return {string}
 */
String.prototype.repeat = function (i) {
  return new Array(i + 1).join(this)
}
function intToRoman(num) {
  const l1 = num % 1000
  const l2 = l1 % 100
  const l3 = l2 % 10
  const t1 = Math.floor(num / 1000)
  const t2 = Math.floor(l1 / 100)
  const t3 = Math.floor(l2 / 10)
  let res = ''
  if (t1) {
    res += 'M'.repeat(t1)
  }
  if (t2) {
    if(t2 === 4) {
      res += 'CD'
    }
    if(t2 === 9) {
      res += 'CM'
    }
    if(t2 === 5) {
      res += 'D'
    }
    if(t2 !== 4 && t2 < 5) {
      res += 'C'.repeat(t2)
    }
    if(t2 !== 9 && t2 > 5) {
      res += 'D' + 'C'.repeat(t2 - 5)
    }
  }
  if (t3) {
    if(t3 === 4) {
      res += 'XL'
    }
    if(t3 === 9) {
      res += 'XC'
    }
    if(t3 === 5) {
      res += 'L'
    }
    if(t3 !== 4 && t3 < 5) {
      res += 'X'.repeat(t3)
    }
    if(t3 !== 9 && t3 > 5) {
      res += 'L' + 'X'.repeat(t3 - 5)
    }
  }
  if(l3) {
    if(l3 === 4) {
      res += 'IV'
    }
    if(l3 === 9) {
      res += 'IX'
    }
    if(l3 === 5) {
      res += 'V'
    }
    if(l3 !== 4 && l3 < 5) {
      res += 'I'.repeat(l3)
    }
    if(l3 !== 9 && l3 > 5) {
      res += 'V' + 'I'.repeat(l3 - 5)
    }
  }
  return res
};
上一篇 下一篇

猜你喜欢

热点阅读