哈希表题目:整数转罗马数字
admin
2024-05-01 08:05:34
0

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:整数转罗马数字

出处:12. 整数转罗马数字

难度

3 级

题目描述

要求

罗马数字包含以下七种字符:I\texttt{I}I、V\texttt{V}V、X\texttt{X}X、L\texttt{L}L、C\texttt{C}C、D\texttt{D}D 和 M\texttt{M}M。

字符数值
I\texttt{I}I1\texttt{1}1
V\texttt{V}V5\texttt{5}5
X\texttt{X}X10\texttt{10}10
L\texttt{L}L50\texttt{50}50
C\texttt{C}C100\texttt{100}100
D\texttt{D}D500\texttt{500}500
M\texttt{M}M1000\texttt{1000}1000

例如,罗马数字 2\texttt{2}2 写做 II\texttt{II}II,即为两个 1\texttt{1}1 相加。12\texttt{12}12 写做 XII\texttt{XII}XII,即为 X+II\texttt{X + II}X + II。27\texttt{27}27 写做 XXVII\texttt{XXVII}XXVII,即为 XX+V+II\texttt{XX + V + II}XX + V + II。

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

  • I\texttt{I}I 可以放在 V\texttt{V}V(5\texttt{5}5)和 X\texttt{X}X(10\texttt{10}10)的左边,来表示 4\texttt{4}4 和 9\texttt{9}9。
  • X\texttt{X}X 可以放在 L\texttt{L}L(50\texttt{50}50)和 C\texttt{C}C(100\texttt{100}100)的左边,来表示 40\texttt{40}40 和 90\texttt{90}90。
  • C\texttt{C}C 可以放在 D\texttt{D}D(500\texttt{500}500)和 M\texttt{M}M(1000\texttt{1000}1000)的左边,来表示 400\texttt{400}400 和 900\texttt{900}900。

给你一个整数,将其转换成罗马数字。

示例

示例 1:

输入:num=3\texttt{num = 3}num = 3
输出:"III"\texttt{"III"}"III"

示例 2:

输入:num=4\texttt{num = 4}num = 4
输出:"IV"\texttt{"IV"}"IV"

示例 3:

输入:num=9\texttt{num = 9}num = 9
输出:"IX"\texttt{"IX"}"IX"

示例 4:

输入:num=58\texttt{num = 58}num = 58
输出:"LVIII"\texttt{"LVIII"}"LVIII"
解释:L=50\texttt{L = 50}L = 50,V=5\texttt{V = 5}V = 5,III=3\texttt{III = 3}III = 3。

示例 5:

输入:num=1994\texttt{num = 1994}num = 1994
输出:"MCMXCIV"\texttt{"MCMXCIV"}"MCMXCIV"
解释:M=1000\texttt{M = 1000}M = 1000,CM=900\texttt{CM = 900}CM = 900,XC=90\texttt{XC = 90}XC = 90,IV=4\texttt{IV = 4}IV = 4。

数据范围

  • 1≤num≤3999\texttt{1} \le \texttt{num} \le \texttt{3999}1≤num≤3999

解法

思路和算法

为了将整数转换成罗马数字,需要从高到低遍历整数的每一位并转换成对应的罗马数字中的符号。

整数的每一位都是 000 到 999,只需要考虑大于 000 的数位。数位值 111 和 555 都可以用一个字符表示,数位值 222、333、666、777 和 888 都可以用两个至四个字符的加法表示,数位值 444 和 999 都可以用两个字符的减法表示。

对于一个字符表示和多个字符的加法表示,由于每个字符的值不会大于当前数位的值,因此可以直接转换。对于减法表示,由于存在字符的值大于当前数位的值(444 的表示为 5−15 - 15−1,999 的表示为 10−110 - 110−1),因此不能直接转换,而是需要引入新的符号。

罗马数字包含 777 种字符,罗马数字中的减法规则定义了 666 种复合符号,因此共有 131313 种符号。

符号数值
I\text{I}I111
IV\text{IV}IV444
V\text{V}V555
IX\text{IX}IX999
X\text{X}X101010
XL\text{XL}XL404040
L\text{L}L505050
XC\text{XC}XC909090
C\text{C}C100100100
CD\text{CD}CD400400400
D\text{D}D500500500
CM\text{CM}CM900900900
M\text{M}M100010001000

使用上述 131313 种符号,整数中每个数位的每个值对应的罗马数字的表示是唯一的,因此每个整数对应的罗马数字的表示是唯一的。

转换方法是:从大到小依次遍历 131313 种符号对应的数值,对于每个数值,如果当前的 num\textit{num}num 大于或等于该数值,则将当前符号拼接到罗马数字中,并将当前数值从 num\textit{num}num 中减去,直到 num\textit{num}num 小于当前数值,然后对下一个数值继续上述操作,直到 num\textit{num}num 变成 000。

上述转换方法的一种等价做法是:对于每个数值,计算当前的 num\textit{num}num 除以该数值的商(向零取整),即可得到当前符号在罗马数字中的出现次数,将当前符号按照出现次数拼接到罗马数字中,并将 num\textit{num}num 对当前的数值取模,即完成当前符号的拼接,然后对下一个数值继续上述操作,直到 num\textit{num}num 变成 000。

代码

class Solution {static final int[] VALUES = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};static final String[] SYMBOLS = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};public String intToRoman(int num) {StringBuffer sb = new StringBuffer();int length = VALUES.length;for (int i = 0; i < length; i++) {int value = VALUES[i];String symbol = SYMBOLS[i];int count = num / value;for (int j = 0; j < count; j++) {sb.append(symbol);}num %= value;}return sb.toString();}
}

复杂度分析

  • 时间复杂度:O(1)O(1)O(1)。由于符号的数量固定,因此转换的操作次数固定。

  • 空间复杂度:O(1)O(1)O(1)。由于符号的数量固定,因此存储对应关系使用的空间固定。

相关内容

热门资讯

泰国好的恐怖片 泰国好的恐怖片  1.   泰国恐怖片《鬼影》   25岁的泰国摄影师「东」(亚莱特 Ananda...
唐家三少 的 哪部作品最好看啊 唐家三少 的 哪部作品最好看啊一般情况就看代表作就行了:代表作有《斗罗大陆》、《神印王座》和已被改编...
求两三本特别特别好看的玄幻小说 求两三本特别特别好看的玄幻小说求两三本特别特别好看的玄幻小说土豆的看过了雪鹰领主 武炼巅峰 元尊 圣...
看一只蝴蝶 从蝉蛹到破茧 看一... 看一只蝴蝶 从蝉蛹到破茧 看一朵花蕾 从绽放到绚烂 什么里的歌词不是歌词,是出自一片散文《世间所有相...
关于梵高的书籍 关于梵高的书籍1、林和生写的《凡·高:麦田里的人》 ,四川人民出版社1998年版 。 2、美国的欧...
急!!!!!!童言趣事 急!!!!!!童言趣事急需要一些很经典的关于小孩子说出口的话语,越多越好,越经典越好~谢谢!... ...
闹闹闹别闹我的螺丝刀是什么歌 闹闹闹别闹我的螺丝刀是什么歌闹闹闹别闹我的螺丝刀是什么歌牵挂你的人是我《Get now》, 《速度与...
sin游戏杂谈哪一期里有讲到闺... sin游戏杂谈哪一期里有讲到闺蜜,记得是讲感情事一旦找闺蜜最后就不会有好结果什么的希望你也在这个世界...
佛经中关于“贪”“嗔”“痴”的... 佛经中关于“贪”“嗔”“痴”的故事看看《白话百业经》西游记猪八戒孙悟空沙和尚贪嗔痴
自主品牌性价比担当,长安欧尚X... 自主品牌性价比担当,长安欧尚X7对比宝骏530上汽通用啥时候成了自主品牌了?宝骏是上汽、通用、五菱三...
豌豆花是蝶状花吗?开蝶状花的树... 豌豆花是蝶状花吗?开蝶状花的树有哪些?豌豆花确实是属于蝶形花。豆科植物多呈蝶形花,包括大豆、落花生、...
女主姓乔 好像叫乔程曦 和男主... 女主姓乔 好像叫乔程曦 和男主青梅竹马男主装作喜欢女主朋友 表现的很花心 有个女配姓白 这部小说叫什...
树枝在微风中摇曳,好像在欢迎我... 树枝在微风中摇曳,好像在欢迎我们。请教一下,这是比喻句夸张句拟人句,什么句?谢谢!欢迎我们。摇曳。这...
西北方言"聊咋咧!&... 西北方言"聊咋咧!"是什么意思?这三个字是这么写吗?前两个字何意??"聊咋咧"是陕西关中的方言,是"...
请推荐个不像《好想告诉你》那么... 请推荐个不像《好想告诉你》那么青涩。男主角又像守护甜心里的几斗一样的校园爱情动漫。sa特优生】会长是...
艺术教育对宝贝建立安全感有多重... 艺术教育对宝贝建立安全感有多重要“妈咪,今天老师又赞我的画画得好棒!”小宝激动地拉着我跟我说。看到宝...
故事画家画马告诉我们的道理? 故事画家画马告诉我们的道理?这个故事告诉我们:一个人虽然在台上表演了那么短短的几分钟,可在背后有着很...
我站在你背后你会回头看我一眼吗... 我站在你背后你会回头看我一眼吗怎样回答?对不起我不爱你,所以回不了头如果他这样说的话,肯定还是非常喜...
如果一个人喜欢你十年不变心,你... 如果一个人喜欢你十年不变心,你愿意接受她吗?假如你对她没感觉呢?假如你喜欢上别的女孩了呢? ...
每次断开电源电脑重新开机都要按... 每次断开电源电脑重新开机都要按F1.而且时间都会重置。主板电池没电了