当前位置: 首页 > news >正文

LeetCode整数转罗马数字

题目描述

七个不同的符号代表罗马数字,其值如下:

符号
I1
V5
X10
L50
C100
D500
M1000

罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:

  • 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
  • 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
  • 只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式

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

示例 1:

输入num = 3749

输出"MMMDCCXLIX"

解释:

3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC 由于 500 (D) +100 (C) + 100 (C)
40 = XL 由于 50 (L) 减 10 (X)
9 = IX 由于 10 (X) 减 1(I)
注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位

示例 2:

输入num = 58

输出"LVIII"

解释:

50 = L
8 = VIII

示例 3:

输入num = 1994

输出:"MCMXCIV"

解释:

1000 = M
900 = CM
90 = XC
4 = IV

解题思路

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

//转换表为:
    字符     数值     进位
     I       1       个位值为1
     V       5       个位值为5
     X       10      十位值为1
     L       50      十位值为5
     C       100     百位值为1
     D       500     百位值为5
     M       1000    千位值为1

由罗马数字表示规则可知

一般情况下 数字组成:大的数字位+小的数字位

  • 例如:6:VI 7:VII 8:VIII
  • 可知:数值大小 == 大的数字位+小的数字位
  • 再如:1:I 2:II 3: III

但当罗马数字进位值(个、十、百、千)为 94 时,数字组成变为:小的数字+大的数字

例如:

罗马数字阿拉伯数字
IV4
IX9
XL40
XC90
CD400
CM900
  • 由上述可以推出罗马数字每个进位值1-9的表示法:
  • 个位【1-9】:I、II、III、IV、V、VI、VII、VIII、IX (对应阿拉伯数字 X%10
  • 十位【1-9】:X、XX、XXX、XL、L、LX、LXX、LXXX、XC (对应阿拉伯数字 (X%100)/10
  • 百位【1-9】:C、CC、CCC、CD、D、DC、DCC、DCCC、CM (对应阿拉伯数字(X%1000)/100
  • 千位【1-9】:M、MM、MMM (对应阿拉伯数字 X/1000
  • 由以上可知一个阿拉伯数字 => 罗马数字
  • num => num/1000 + (num%1000)/100 +(num%100)/10 + num%10

代码

/**
 * @param {number} num
 * @return {string}
 */
var intToRoman = function(num) {
    var Q = ["", "M", "MM", "MMM"];
    var B = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"];
    var S = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"];
    var G = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];
    return Q[Math.floor(num/1000)] + B[Math.floor((num%1000)/100)] + S[Math.floor((num%100)/10)] + G[num%10];
};

代码分析

  1. 首先,定义了四个数组 QBSG,分别代表千位、百位、十位和个位的罗马数字表示。每个数组都包含了从0到9的罗马数字表示,这些表示遵循了罗马数字的规则,包括减法形式(例如 IVIX 等)。

  2. 函数 intToRoman 接受一个参数 num,这个参数是要转换的整数。

  3. 使用 Math.floor(num/1000) 计算 num 除以1000的商,这将给出千位上的罗马数字数量。然后通过 Q 数组索引这个数量,得到千位上的罗马数字表示。

  4. 使用 (num%1000)/100 计算 num 除以1000的余数再除以100,这将给出百位上的罗马数字数量。然后通过 B 数组索引这个数量,得到百位上的罗马数字表示。

  5. 使用 (num%100)/10 计算 num 除以100的余数再除以10,这将给出十位上的罗马数字数量。然后通过 S 数组索引这个数量,得到十位上的罗马数字表示。

  6. 使用 num%10 计算 num 除以10的余数,这将给出个位上的罗马数字数量。然后通过 G 数组索引这个数量,得到个位上的罗马数字表示。

  7. 最后,将千位、百位、十位和个位的罗马数字表示拼接起来,形成最终的罗马数字字符串,并返回这个字符串。

这个函数的实现是高效的,因为它避免了递归和复杂的条件判断,而是直接使用数组索引来获取每个位数的罗马数字表示。时间复杂度为 O(1)

相关文章:

  • 使用NumPy进行线性代数的快速指南
  • 内网Debian\Ubuntu服务器安装dep包,基于apt-rdepends下载相关依赖
  • Reverse Tabnabbing漏洞的理解和利用
  • SQLite数据库
  • 前端 | Uncaught (in promise) undefined
  • 通过Express + Vue3从零构建一个用户认证与授权系统(一)项目结构设计
  • 241007深度学习之LeNet
  • C++入门基础知识107—【关于C++continue 语句】
  • Pikachu-Sql Inject-数字型注入(GET)
  • 小猿口算脚本
  • 2024面试自动化测试面试题【含答案】
  • Linux安装conda
  • 我服了,上班在 Excel 里都能摸鱼。。。
  • 爬虫prc技术----小红书爬取解决xs
  • 数据结构_day1
  • 计算机视觉之OpenCV vs YOLO
  • 设计一个日志管理系统,支持多级别日志记录
  • 常用的8款文件加密软件分享|2024办公文件用什么加密软件保护?
  • Git常用命令(持续更新中)
  • 凡事预则立,不预则废
  • 国家税务总局泰安市税务局:山东泰山啤酒公司欠税超536万元
  • 首批证券公司科创债来了!拟发行规模超160亿元
  • 迪拜金融市场CEO:2024年市场表现出色,超八成新投资者来自海外
  • 技术派|伊朗展示新型弹道导弹,美“萨德”系统真的拦不住?
  • 农行原首席专家兼浙江省分行原行长冯建龙主动投案被查
  • 马上评|演出服“穿过就退货”的闹剧不该一再重演