前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Daily Code 365 | 01 整数转罗马数字

Daily Code 365 | 01 整数转罗马数字

作者头像
微芒不朽
发布2022-09-06 20:42:42
1590
发布2022-09-06 20:42:42
举报
文章被收录于专栏:前端进阶-詹躲躲

【题目】

罗马数字包含以下七种字符:I, V, X, L,C,D 和 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 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 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。

给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。 示例 1: 输入: 3 输出: "III" 示例 2: 输入: 4 输出: "IV" 示例 3: 输入: 9 输出: "IX" 示例 4: 输入: 58 输出: "LVIII" 解释: L = 50, V = 5, III = 3. 示例 5: 输入: 1994 输出: "MCMXCIV" 解释: M = 1000, CM = 900, XC = 90, IV = 4.


【解法】

代码语言:javascript
复制
/**
 * @param {number} num
 * @return {string}
 */
var intToRoman = function(num) {
  let bitRrr = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];
  let tenArr = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'];
  let hundredArr = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'];
  let thousandArr = ['M', 'MM', 'MMM'];
  let result = 0;
  let bit = num % 10;
  let ten = (num % 100 - bit) / 10;
  let hundred = (num % 1000 - ten * 10 - bit) / 100;
  let thousand = (num - hundred * 100 - ten * 10 - bit) / 1000;
  if (num < 10) {
    result = '' + bitRrr[bit];
  }
  if (num >= 10 && num < 100) {
    result = '' + tenArr[ten] + bitRrr[bit];
  }
  if (num >= 100 && num < 1000) {
    result = '' + hundredArr[hundred] + tenArr[ten] + bitRrr[bit];
  }
  if (num >= 1000 && num < 4000) {
    result = '' + thousandArr[thousand - 1] + hundredArr[hundred] + tenArr[ten] + bitRrr[bit];
  }
  return result
};

【参考解法】

代码语言:javascript
复制
/**
 * @param {number} num
 * @return {string}
 */
var romanToInt = function(s) {
  var romanArr = [];
  var result = 0;
  romanArr['I'] = 1;
  romanArr['V'] = 5;
  romanArr['X'] = 10;
  romanArr['L'] = 50;
  romanArr['C'] = 100;
  romanArr['D'] = 500;
  romanArr['M'] = 1000;

  for (var i = 0; i < s.length; i++) {
    // 先判断最后一位的最后一位是否存在,如果不存在,例如“I”,只有一位,所以就返回 1。
    if (!romanArr[s[i + 1]]) {
      result += romanArr[s[i]];
      break;
    };
    // 如果前一个数比后一个数大,把前一个数再添加到结果中
    if (romanArr[s[i]] >= romanArr[s[i + 1]]) {
      result += romanArr[s[i]];
    } else {
      // 如果前一个数小于后一个数,将结果加上后位进行运算,记得 i+1
      result = result + romanArr[s[i + 1]] - romanArr[s[i]];
      i++;
    };
  };
  return Number(result);
};

随心远行,宁静致远。

人生所有的时间,都不是虚度的,你只要经过,肯定会留下痕迹,会变得成熟。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叫我詹躲躲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档