leetcode 12.整数转罗马数字

【中等】力扣算法题解析LeetCode12:整数转罗马数字 本文介绍如何将整数转换为罗马数字,通过贪心算法高效实现。关键点包括:预定义数值与罗马符号的映射(含减法形式),按从大到小顺序处理剩余数字,并利用StringBuilder优化性能。Java实现代码执行时间为3ms,内存消耗41.3MB,时间复杂度O(1)。适用于1-3999范围内的整数转换,满足题目要求的特殊规则(如4/9的减法表示等)。 阅读详情

leetcode 12.整数转罗马数字

题目描述

罗马数字包含以下七种字符: 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.

解题思路

哈希表对应

建立一个哈希表,存放数字对应的罗马字符,对应数字转罗马字符而言,举个例子:298 = 2 * 100 + 1 * 90 + 1 * 5 + 3 * 1

即如果我们可以知道一个num中,他每个罗马单元对应的个数,就可以很方便的说出罗马数字, 298 = “C” + “C” + “XC” + “V” + “I” + “I” + “I”。即可以采用对每个罗马数字取整,计算该罗马数字的数量,就可以转换成整体的罗马数字

class Solution {
public:
    string intToRoman(int num) {
        string res = "";
        if((num<=0) || (num>3999)){
            return res;
        }
        unordered_map<int, string> romanMap = {{1,"I"},{4,"IV"},{5,"V"},{9,"IX"},{10,"X"},{40,"XL"},{50,"L"},{90,"XC"},{100,"C"},{400,"CD"},{500,"D"},{900,"CM"},{1000,"M"}};
        unordered_map<int, int> numMap = {{1,1},{2,4},{3,5},{4,9},{5,10},{6,40},{7,50},{8,90},{9,100},{10,400},{11,500},{12,900},{13,1000}};
        
        while(num){
            for(int i=13; i>0;i--){
                int times = num/numMap[i];
                while(times){
                    res += romanMap[numMap[i]];
                    times--;
                }
                num %= numMap[i];
            }
        }
        return res;
    }
};

贪心算法

每种罗马字符都有对应的数值,把一个数字转换成罗马数字,可以理解为把数字拆分,由指定的几个数字相加得到目标结果。采用贪心算法的思想,即每次尽可能多的取最大的数字,知道num等于零。

class Solution {
public:
    string intToRoman(int num) {
        vector<int> romanValue = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        vector<string> roman = {"M","CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        string res = "";

        for(int i=0; i<13; i++){
            while(num >= romanValue[i]){
                res += roman[i];
                num -= romanValue[i];
            }
        }
        return res;
    }
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

Box2D-Lite源码阅读笔记(2) 0.初始化函数 static void InitDemo(int index) { world.Clear(); numBodies = 0; numJoints = 0; bomb = NULL; demoIndex = index; demos[index](bodies, joints); } 在这个初始化函数中,一般会默认执行index=0的函数,这个函数就是一个示例,因为示例比较简单,所以也便于研究,示例效果如下。 就是一个方块。 进入第一个示例函数。(忽略我加的注释) 阅读详情

相关推荐

TiDB实战篇-数据库写入慢常见处理方式

TiDB实战篇-数据库写入慢常见处理方式

S1124654的博客 1009

整数转罗马数字(详解+图解)

目录12. 整数转罗马数字贪心算法思路分析java代码:复杂度分析时间复杂度空间复杂度暴力匹配法思路分析java代码复杂度分析时间复杂度空间复杂度 12. 整数转罗马数字 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000

qq_43413774的博客 1880

操作系统笔记(含王道计算机考研——操作系统课件)

操作系统(OS) 笔记根据B站王道计算机考研——操作系统视频整理所得,视频链接:https://b23.tv/0I2qex 视频中所用课件:链接:https://pan.baidu.com/s/101bFWm0Tv0emNpEneidYPA 提取码:y3dd 1.计算机系统概述 1.简介 什么是操作系统? 操作系统(Operating Ststem, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是

拧发条鸟的博客 6万+

算法:整数转罗马数字(integer-to-roman)。

给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。

孤芳不自赏 3078

储能BMS三级架构解析:从模组到堆的管理与控制

本文深入解析了储能电池管理系统(BMS)的核心三级架构,即电池模组管理层(BMU)、电池簇管理层(BCMU)和电池堆管理层(BAMS)。文章详细阐述了各级的职能分工与协同机制,从底层数据采集、均衡管理,到中层信息汇总与安全控制,再到顶层的系统总控与对外通信,揭示了该架构如何实现大规模储能电池的精细化、安全与高效管理。

ik678901234的博客 471

scGPT实战指南:如何用生成式AI加速你的单细胞多组学研究?

本文提供了scGPT在单细胞多组学研究中的实战指南。详细介绍了从环境部署、数据预处理到细胞类型注释与扰动预测等核心任务的操作流程。通过利用生成式AI和Transformer基础模型,scGPT能够显著加速分析,并提升细胞注释的准确性及基因调控网络推断的深度,为研究人员提供了强大的AI分析引擎。

weixin_29215815的博客 402

LeetCode算法:12. 整数转罗马数字

罗马数字符号罗马数字由 7 个不同的单字母符号组成,每个符号对应一个具体的数值。此外,减法规则(如问题描述中所述)给出了额外的 6 个复合符号。这给了我们总共 13 个独特的符号(每个符号由 1 个或 2 个字母组成),如下图所示。罗马数字的唯一表示法让我们从一个例子入手。考虑 140 的罗马数字表示,下面哪一个是正确的?我们用来确定罗马数字的规则是:对于罗马数字从左到右的每一位,选择尽可能大的符号值。对于 140,最大可以选择的符号值为 C=100。

qq_24691007的博客 873

MOS管的体二极管在LLC中的作用

MOSFET是一个三端器件(G、D、S),在N沟道MOSFET的结构中,源极和漏极之间的N型材料中自然形成了一个寄生的PN结,这个PN结就是体二极管(Body Diode),它是不可避免的器件结构。📌 对于N沟MOSFET:体二极管是从漏极 D 到源极 S 的正向导通二极管,方向为 D → S。MOS管的体二极管在LLC中并不是主功率通道,但却是实现软开关(ZVS)和能量过渡的关键“临时路径”。用得好,它是你的朋友;忽略它,电路就可能烧毁。

weixin_43199439的博客 699

罗马数字与整数相互转换

罗马数字转整数 题目描述 罗马数字包含以下七种字符: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 写...

AllenSquirrel 889

OpenStack [ compute_id ] 设计上的小缺陷

而 nova 代码中硬编码(或默认配置)将 compute_id 放在 site-packages 目录,属于 设计上的小缺陷—— 把 “库安装目录” 和 “运行时数据目录” 混在一起了,才导致需要临时调整这个目录的权限。# 配置项说明:node_identity_file 是 nova 用于指定节点标识文件路径的官方配置项,优先级高于代码中的默认路径。自定义 compute_id 路径,指向 /var/lib/nova/ 目录下的 compute_id 文件;

求知若渴,虚心若愚。 491

【技能】OpenClaw Memory 与 MemOS 两种 AI 记忆方案深度解析

摘要:本文对比了两种AI记忆系统方案。OpenClaw Memory是轻量级记忆助手,内置SQLite存储,支持语义搜索,部署简单成本低,适合日常对话记忆需求。MemOS是自学习系统,通过Neo4j和Qdrant实现技能自进化,但需部署4套服务,门槛高成本大。建议普通用户选择OpenClaw Memory,技术玩家可逐步尝试MemOS。两种方案各具优势,需根据实际需求选择。

海兰 195

12. 整数转罗马数字

IVXLCD和M。例如, 罗马数字2写做II,即为两个并列的1。12写做XII,即为XII。$27 $写做XXVII, 即为XXVII。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做IIII,而是IV。数字1在数字5的左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为IX。I可以放在V5和X10的左边,来表示4和9。X可以放在L50和C100的左边,来表示40。

qq_33480558的博客 630

“软开关”硬技术!ZVS和ZCS到底谁更牛?看完这个例子你就懂了!

❌ ZVS 和 ZCS 是万能的?→ 不,它们都有实现条件,谐振参数选不好照样硬拐弯!❌ 只要有谐振就一定ZVS?→ 不,一定要设计合适的死区时间和负载条件才行!ZVS 是让电压先“冷静”,ZCS 是让电流先“退场”。一个是开门不撞墙,一个是关门不甩门。懂了它们,功率设计就是在跳华尔兹而不是打架!💃🔌。

weixin_43199439的博客 1235

力扣LeetCode第12题整数转罗马数字

力扣LeetCode第12题整数转罗马数字

weixin_44061444的博客 237

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

LeetCode12_整数转罗马数字

模拟

Haolin_Liu的博客 992

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

leetcode力扣12. 整数转罗马数字

罗马数字包含以下七种字符:I,V,X,L,C,D和M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做II,即为两个并列的 1。1...

kaggle expert,全球排名前1000,清华计算机研究生,兴趣算法工程 643

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LeetCode 12 整数转罗马数字

LeetCode 12 整数转罗马数字 题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数...

Ailecccc的博客 209

[leetcode_12_intToRoman] 力扣第12题 整数转罗马数字

力扣第12题 整数转罗马数字

C_0010的博客 2650

力扣(LeetCode 12)整数转罗马数字 python

题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 10...

qq_41318002的博客 297

Leetcode. 12 整数转罗马数字

把所有形如IV和IX等的形式全部表示出来(4、9、40、90、400、900)

2301_76941161的博客 528

力扣(leetcode)12. 整数转罗马数字

链接 12. 整数转罗马数字 - 力扣(LeetCode) https://leetcode-cn.com/problems/integer-to-roman/ 12. 整数转罗马数字 难度中等864 罗马数字包含以下七种字符:I,V,X,L,C,D和M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 50...

qq_40788199的博客 299

12. 整数转罗马数字【 力扣(LeetCode) 】

罗马数字是通过添加从最高到最低的小数位值的转换而形成的。给定一个整数,将其转换为罗马数字。

yyh520025的博客 499

Leetcode12. 整数转罗马数字

Leetcode12. 整数转罗马数字 题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗...

会流泪de鱼的博客 113

LeetCode 12.整数转罗马数字

如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位。40 = XL 由于 50 (L) 减 10 (X)9 = IX 由于 10 (X) 减 1 (I)输入:num = 58。

qq_74747823的博客 590

Leetcode 12. Integer to Roman 整数转罗马数字

12. Integer to Roman 整数转罗马数字 标签: Leetcode 题目地址:https://leetcode-cn.com/problems/integer-to-roman/ 题目描述 罗马数字包含以下七种字符:&amp;amp;nbsp;I,&amp;amp;nbsp;V,&amp;amp;nbsp;X,&amp;amp;nbsp;L,C,D&amp;amp;nbsp;和&amp;amp;nbsp;M。 字符

CoderWangSon 324

LeetCode_12_整数转罗马数字

文章目录题目思路一:彻底分解思路二:贪心算法 题目 罗马数字包含以下七种字符: 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 写做 X

肥宅快乐博客 234
上一篇: leetcode 11.盛最多水的容器
下一篇: leetcode 58.最后一个单词的长度
黑暗主宰
博客等级 码龄9年 72粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值