【每日一题】LeetCode - 整数转罗马数字

在罗马数字系统中,七个不同的符号代表不同的值:

符号
I1
V5
X10
L50
C100
D500
M1000

罗马数字的表示方式是从最大值开始逐次减去每个符号的值,通过组合这些符号构建最终的表示形式。本文将介绍一个基于贪心策略的解决方案,将整数转换为罗马数字。

解题思路

给定一个整数,我们需要通过罗马数字表示出来。罗马数字的构建规则非常有趣:通常情况下,从较大的数值符号开始,按递减顺序逐步添加符号来表示出整个数。但当数位中以4或9开头时,采用“减法形式”表示——比如4用“IV”而不是“IIII”表示,9则用“IX”而不是“VIIII”。这里,我们需要从高位逐步匹配适合的罗马符号值,并从当前整数中减去该符号对应的数值,直到当前整数变为0。

在此代码实现中,首先定义了一个映射表,按从大到小的顺序列出整数与罗马符号的关系,这样便于直接找到合适的符号。然后,我们从最大的数值符号开始遍历,使用一个 while 循环来处理当前数值。当当前数值大于等于符号所代表的值时,减去该值并将对应的符号附加到结果字符串中。通过不断重复上述过程,我们最终得到完整的罗马数字表示。

示例

以下是几个示例解释:

  • 输入 num = 3749,输出结果为 "MMMDCCXLIX",解释如下:
    • 3000 = “MMM”,因为 1000 (M) + 1000 (M) + 1000 (M)
    • 700 = “DCC”,因为 500 (D) + 100 © + 100 ©
    • 40 = “XL”,因为 50 (L) - 10 (X)
    • 9 = “IX”,因为 10 (X) - 1 (I)
  • 输入 num = 58,输出结果为 "LVIII",解释如下:
    • 50 = “L”
    • 8 = “VIII”,因为 5 (V) + 1 (I) + 1 (I) + 1 (I)
  • 输入 num = 1994,输出结果为 "MCMXCIV",解释如下:
    • 1000 = “M”
    • 900 = “CM”,因为 1000 (M) - 100 ©
    • 90 = “XC”,因为 100 © - 10 (X)
    • 4 = “IV”,因为 5 (V) - 1 (I)

代码实现

class Solution {
public:string intToRoman(int num) {string ans;vector<pair<int, string>> m = {{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"}};for(auto p : m) {while(num >= p.first) {num -= p.first;ans += p.second;}}return ans;}
};

代码解释

  1. 定义罗马数字映射表:首先,我们使用 vector<pair<int, string>> 来存储每一个可能的数值和相应的罗马字符。这里按数值大小从高到低排序,便于逐步匹配。
  2. 贪心算法构建字符串:接下来,遍历映射表中的每个 (值, 符号) 对。当输入整数大于等于当前值时,循环执行减去当前值并将相应符号添加到结果字符串。通过这个贪心算法,我们逐步构建最终的罗马数字表示。
  3. 终止条件:当输入整数逐步被减为0时,算法终止,最终字符串即为罗马数字。

时间复杂度与空间复杂度

时间复杂度:O(1)。虽然存在一个 while 循环嵌套在 for 循环中,但我们处理的是有限数的整数符号对,映射表长度固定。故时间复杂度可以认为是常数时间。

空间复杂度:O(1)。代码只需要常量空间存储罗马数字符号对,以及一个字符串变量用于保存结果,因此空间复杂度为常数。

扩展思路

在不同的语言中实现该方法也相对容易。例如,在 Python 中可以使用类似的方法,也可以采用字典和字符串的拼接来表示相应的转换。需要注意的是,罗马数字规则虽然固定,但在一些特殊情况下仍需仔细考虑,比如在多层循环处理时可能会影响效率。贪心算法适用于此类问题,因为它确保每次选择的是当前情况下最佳的罗马符号。

在这里插入图片描述

总结

该解法基于贪心算法思想,通过逐步减去数值并附加罗马符号的方式实现整数到罗马数字的转换。代码清晰、易于理解,且高效处理所有可能的输入整数。总体上,这种方法不仅具有简单的逻辑流,也符合罗马数字的规则,尤其是减法表示法的运用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity开发之Line Renderer

Line Renderer 是一个有用的工具&#xff0c;可让您在游戏中绘制线条。 它可以用作游戏的函数或调试标记。 在这里&#xff0c;让我们创建一个程序&#xff0c;根据基本用法在 Line Renderer 上移动。 目录 如何使用 Line Renderer 和基础知识 在场景中放置 Line Renderer关键组…

Catalan数 C++解决

输入描述 输入一个正整数n。 输出描述 输出Catalan数的前n项。 用例输入 1 0 用例输出 1 1 用例输入 2 5 用例输出 2 1 1 2 5 14 42 #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;int dp[n1]{0};dp[0]dp[1]1;for(int m2;…

守护头顶安全——AI高空抛物监测,让悲剧不再重演

在城市的喧嚣中&#xff0c;我们享受着高楼林立带来的便捷与繁华&#xff0c;却往往忽视了那些隐藏在高空中的危险。近日&#xff0c;震惊全国的高空抛物死刑案件被最高院核准并执行。案件中被告人多次高空抛物的举动&#xff0c;夺去了无辜者的生命&#xff0c;也让自己付出了…

Go 语言中的 for range 循环教程

在 Go 语言中&#xff0c;for range 循环是一个方便的语法结构&#xff0c;用于遍历数组、切片、映射和字符串。本教程将通过示例代码来帮助理解如何在 Go 中使用 for range 循环。 package mainimport "fmt"func main() {// 遍历切片并计算和nums : []int{2, 3, 4}…

Kafka-代码示例

一、构建开发环境 File > New > Project 选择一个最简单的模板 项目和坐标命名 配置maven路径 添加maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --><dependency><groupId>org.apache.kaf…

深度学习 基本函数01

np.dot 是 NumPy 库中的一个函数&#xff0c;用于计算两个数组的点积&#xff08;也称为内积或数量积&#xff09;。点积是两个向量的对应元素乘积之和。 np.random.normal 是 NumPy 库中的一个函数&#xff0c;用于生成符合正态分布&#xff08;也称为高斯分布&#xff09;的…

项目管理软件中这6个小技巧帮助项目经理同时管理多个项目

在网上看到一个数据&#xff0c;只有15%的项目经理一次只需要负责一个项目&#xff0c;其他的项目经理都需要同时负责多个项目&#xff0c;甚至有15%的项目经理一次需要负责10个以上的项目。 我在工作中&#xff0c;也只有很少很少的时间里&#xff0c;是一次性只负责一个项目…

目标检测——yolov5-3.1的环境搭建和运行

第一步&#xff1a;安装anaconda环境&#xff0c;并且配置好cuda&#xff0c;安装需要的基本包 查看对应cuda版本&#xff0c;后续下载cudatoolkit需要对应版本 nvcc -V 第二步&#xff1a;创建虚拟环境&#xff0c;激活环境&#xff0c;安装所需的包 conda create -n yolo…

Visual studio 下载安装

1&#xff0c;Visual stutdio 网址 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 2&#xff0c;下划页面&#xff0c;点击 较早的下载 3&#xff0c;选择对应的版本进行下载

《深度学习》YOLO v1网络架构 、损失值、NMS极大值抑制

目录 一、Yolo系列v1 1、核心思想 2、示例 3、流程图解析 二、YOLO系列v1损失函数 1、位置误差 2、置信度误差 3、类别概率损失 三、NMS非极大值抑制 1、概念 2、步骤 四、YOLO v1优缺点 1、优点 1&#xff09;速度快 2&#xff09;端到端 3&#xff09;多尺度…

docker 可用镜像服务地址(2024.10.25亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因&#xff1a;镜像服务器地址不可用。 2.可用地址 编辑daemon.json&#xff1a; vi /etc/docker/daemon.json内容修改如下&#xff1a; {"registry-mirrors": ["https://…

光伏业务管理软件:提升企业管理效率的利器

一、优化业务流程 光伏业务管理软件能够对企业的各项业务流程进行全面梳理和优化。从项目前期的规划设计、设备采购&#xff0c;到项目建设中的施工管理、质量控制&#xff0c;再到项目后期的运维服务&#xff0c;软件都可以进行有效的跟踪和管理。 通过规范业务流程&#xf…

银行客户贷款行为数据挖掘与分析

#1024程序员节 | 征文# 在新时代下&#xff0c;消费者的需求结构、内容与方式发生巨大改变&#xff0c;企业要想获取更多竞争优势&#xff0c;需要借助大数据技术持续创新。本文分析了传统商业银行面临的挑战&#xff0c;并基于knn、逻辑回归、人工神经网络三种算法&#xff0…

Spring Boot框架下中小企业设备管理系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理中小企业设备管理系统的相关信息成为必然。…

新手入门之高级maven

文章目录 前言一、分模块设计与开发Maven 分模块设计的优势Maven 分模块设计的基本结构Maven 分模块项目的构建 二、继承与聚合三种打包方式&#xff1a;Maven 父模块和子模块的关系Maven 中的版本锁定1.<dependencyManagement> 标签主要特点&#xff1a; 2.使用 <pro…

刷题 - 图论

1 | bfs/dfs | 网格染色 200. 岛屿数量 访问到马上就染色&#xff08;将visited标为 true)auto [cur_x, cur_y] que.front(); 结构化绑定&#xff08;C17&#xff09;也可以不使用 visited数组&#xff0c;直接修改原始数组时间复杂度: O(n * m)&#xff0c;最多将 visited 数…

基于GPT的智能客服落地实践

&#x1f4cd;前言 在日常生活中&#xff0c;「客服」这个角色几乎贯穿着我们生活的方方面面。比如&#xff0c;淘宝买东西时&#xff0c;需要客服帮你解答疑惑。快递丢失时&#xff0c;需要客服帮忙找回。报名参加培训课程时&#xff0c;需要客服帮忙解答更适合的课程…… 基…

重构商业生态:DApp创新玩法与盈利模式的深度剖析

随着区块链技术的发展&#xff0c;DApp&#xff08;去中心化应用&#xff09;正在从实验走向成熟。DApp以去中心化、透明性和不可篡改性为基础&#xff0c;结合智能合约&#xff0c;逐步改变传统商业运作模式&#xff0c;创造新的市场生态。本文将从DApp的独特优势、创新玩法和…

找不到包的老版本???scikit-learn,numpy,scipy等等!!

废话不多说 直接上链接了&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple/https://pypi.tuna.tsinghua.edu.cn/simple/https://pypi.tuna.tsinghua.edu.cn/simple/xxx/ 后面的这个xxx就是包的名字 大家需要什么包的版本&#xff0c;直接输进去就可以啦 举个栗子&#…

【汇编语言】第一个程序(一)—— 一个源程序从写出到执行的过程

文章目录 前言1. 第一步&#xff1a;编写汇编源程序2. 第二步&#xff1a;对源程序进行编译连接3. 第三步&#xff1a;执行可执行文件中的程序结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程…