首页 > 其他分享 >12. 整数转罗马数字

12. 整数转罗马数字

时间:2024-01-24 16:25:29浏览次数:21  
标签:12 string 整数 IV 罗马数字 num 数字 1000

1.题目介绍

罗马数字包含以下七种字符: 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:
输入: num = 3
输出: "III"

示例 2:
输入: num = 4
输出: "IV"

示例 3:
输入: num = 9
输出: "IX"

示例 4:
输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.

示例 5:
输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:
1 <= num <= 3999

2.题解

2.1 模拟(打表)

思路

利用键值对形式 列出所有基本组合中的值和对应标志字符串
然后循环得到具体字符串

代码

const pair<int, string> 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"},
};

class Solution {
public:
    string intToRoman(int num) {
        string str;
        for(auto [value, symbol]: valueSymbols){
            while(num >= value){
                str += symbol;
                num -= value;
            }
            if(num == 0) break;
        }
        return str;
    }
};

2.2 硬编码数字(打表)

思路

回顾前言中列出的这 13 个符号,可以发现:

千位数字只能由 M 表示;
百位数字只能由 C,CD,D 和 CM 表示;
十位数字只能由 X,XL,L 和 XC 表示;
个位数字只能由 I,IV,V 和 IX 表示。
这恰好把这 13 个符号分为四组,且组与组之间没有公共的符号。因此,整数 num 的十进制表示中的每一个数字都是可以单独处理的。

进一步地,我们可以计算出每个数字在每个位上的表示形式,整理成一张硬编码表。如下图所示,其中 0 对应的是空字符串。

而且由于1 <= num <= 3999,我们可以得到num的每一位数字,根据上表中数字与对应位置的标志字符串,就可以得到完整的结果了

代码

const string thousands[] = {"", "M", "MM", "MMM"};
const string hundreds[]  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
const string tens[]      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
const string ones[]      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

class Solution {
public:
    string intToRoman(int num) {
        return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
    }
};

标签:12,string,整数,IV,罗马数字,num,数字,1000
From: https://www.cnblogs.com/trmbh12/p/17984940

相关文章

  • Oracle12c 数据库 警告日志
    目录一:查看警告日志文件的位置二:警告日志内容三:告警日志监控:方案1:方案2:方案3: 正文 回到顶部一:查看警告日志文件的位置        Oracle12c环境下查询,alert日志并不在bdump目录下,看到网上和书上都写着可以通过初始化参数background_dump_dest来查看......
  • STM32CubeMX教程23 FSMC - IS62WV51216(SRAM)驱动
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手2、实验目标使用STM32CubeMX软件配置STM32F407开发板的FSMC实现以轮询或DMA的方式读写IS62WV51216(SRAM)芯片3、......
  • adb命令补充---20240124
    1、如何查看系统是32位还是64位?adbshellgetpropro.product.cpu.abi---返回设备当前CPU的ABI版本号若结果包含"armv7-a"字样,则说明设备是32位;若结果包含"arm64-v8a"字样,则说明设备是64位。如何检测Android应用是32位还是64位?与32位系统不同的是,在64系统中会同时存在两个Zyg......
  • 算法模板 v1.3.2.20240124
    算法模板v1.1.1.20240115:之前的历史版本已经不可寻,创建了第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”与“编译”-“手动开O优化”;将“编译”-“CF模板”中的第20行代码cin>>T;注释;删除“读写”及其目录下的内容;删除“图论”-“欧拉图”-“混合图”;删除“图论”-......
  • 0123今日收获
    今日代码1今日代码2今日代码3今日代码4今日代码5今日代码6今日代码7今日代码8今日代码9!今日收获满满......
  • 0123所学内容
    0123所学内容复习内容hello中的常见问题变量和注释变量的定义:在内存空间中申请一块存储区域变量的注意事项1.必须声明2.必须初始化3.不能重复三种注释标识符的命名规范(Alibaba开发文档)标识符的运用练习1Nameimportjava.util.Scanner;publicclassName{pu......
  • window2012配置开机自启服务
    1、以Nginx服务为例下载配置好Nginx服务后,启动服务访问正常。因主机重启,导致Nginx服务关闭,需要手动启动。2、window2012配置开机自启在window搜索框输入“shell:startup”,打开文件夹目录后,将Nginx启动脚本以快捷方式形式放到该文件夹下即可。 ......
  • [转帖]彻底搞明白 GB2312、GBK 和 GB18030
    https://zhuanlan.zhihu.com/p/453675608 日常工作的过程中,关于字符编码的问题经常让人头疼不已,这篇文章就来捋一捋关于GB2312、GBK、GB18030相关的知识以及它们和Unicode的关系简介GB23121980年,中国发布了第一个汉字编码标准,也即GB2312,全称《信息交换用汉......
  • [转帖]Oracle 12.2 新特性 | PDB不同字符集变更
    https://www.cnblogs.com/cqdba/p/8bef7c432b87807c0680d6791f427b09.html 在oracle12.1版本中,同一CDB中的所有PDB使用的都是相同的字符集,并且Plug-in时PDB也要和目标CDB相同字符集或者是子集,否则plug-in时会失败在PDB_PLUG_IN_VIOLATIONS视图提示,这样影响了PDB的迁移灵活......
  • SciTech-HybridSoftwareEngineering-Software Engineering2ndEditionISBN13:978126072
    Part1:IntroductionandSystemEngineeringChapter1:IntroductionChapter2:SoftwareProcessandMethodologyChapter3:SystemEngineeringPart2:AnalysisandArchitecturalDesignChapter4:SoftwareRequirementsElicitationChapter5:DomainModel......