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

[LeetCode] 12. 整数转罗马数字

12. 整数转罗马数字

罗马数字包含以下七种字符: IVXLCDM

字符          数值
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

题解

要将整数转换为罗马数字,我们可以遵循罗马数字的构成规则。罗马数字由七个不同的符号组成:I, V, X, L, C, D, M。每个符号代表一个特定的值,如 I 代表 1,V 代表 5 等。罗马数字通常从左到右写成从大到小的顺序。但也存在例外,特定的小数字置于大数字的左边用以表示减法,如 IV 表示 4,IX 表示 9。

对于任意给定的整数,我们可以从最大的符号 M(1000)开始,逐渐降低到最小的符号 I(1),并在每一步中确定该符号在罗马数字中可以出现多少次。在这个过程中,我们也需要考虑上述提到的减法规则。下面是一个实现这一过程的方法:

  1. 准备一个包含所有可能的罗马数字符号及其对应整数值的列表。这个列表应该按照符号对应的整数值从大到小排序,并且包括像 IV(4),IX(9),XL(40)这样的组合符号。
  2. 对于给定的整数 num,从列表的最开始(最大符号)迭代,每次尽可能多地从 num 中减去当前符号的整数值,直到 num 为 0。
  3. 每次减去一个符号的值,就将该符号添加到最终的罗马数字字符串中。

以示例 1994 为例,其转换过程如下:

  • M(1000)小于等于 1994,所以我们添加 M 到结果中,并从 1994 减去 1000,得到 994。
  • CM(900)小于等于 994,所以我们添加 CM,并从 994 减去 900,得到 94。
  • XC(90)小于等于 94,所以我们添加 XC,并从 94 减去 90,得到 4。
  • IV(4)等于 4,所以我们添加 IV,并从 4 减去 4,得到 0。
  • 此时 num 变为 0,过程结束。

最终的罗马数字字符串为 “MCMXCIV”。

下面是一个实现这一过程的 C++ 示例代码:

#include <string>
#include <vector>
using namespace std;string intToRoman(int num) {vector<pair<int, string>> values = {{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"}};string result;for (auto &[value, symbol] : values) {while (num >= value) {num -= value;result += symbol;}}return result;
}

此代码遍历 values 列表,每次从 num 中减去尽可能多的当前符号的值,并将相应的罗马数字符号添加到结果字符串中,直到 num 变为 0。

http://www.lryc.cn/news/254877.html

相关文章:

  • 深入了解Java Period类,对时间段的精确控制
  • 企业软件的分类有哪些|app小程序定制开发
  • 选择更好的Notes索引附件方式
  • Vue混淆与还原
  • R语言单因素方差分析+差异显著字母法标注+逐行详细解释
  • linux 消息队列apache-activemq服务的安装
  • 前端数据加密相关问题
  • Vue3中reactive和ref对比
  • 【尘缘送书第五期】Java程序员:学习与使用多线程
  • Linux C语言 34-库封装操作
  • JavaWeb-Tomcat
  • k8s之Pod常用命令详解、镜像拉取策略(imagePullPolicy)
  • Spark低版本适配Celeborn
  • idea报错:Error:java: 不允许在使用 -release 时从系统模块 java.xml 导出程序包?
  • Vector Quantized Diffusion Model for Text-to-Image Synthesis
  • solidity实现ERC1155多代币标准
  • 10、外观模式(Facade Pattern,不常用)
  • <软考>软件设计师-3程序设计语言基础(总结)
  • C/C++---------------LeetCode第278. 第一个错误的版本
  • C语言三种循环输出9*9乘法表
  • IntelliJ IDEA 之初体验
  • java中synchronized和Lock的区别是什么?
  • ESP32-Web-Server编程-通过 Base64 编码在网页中插入图片
  • 聊一聊大模型 | 京东云技术团队
  • pandas空格及网页空格符NBSP替换处理
  • 智能优化算法应用:基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码
  • 数据结构和算法-栈
  • C#基础与进阶扩展合集-进阶篇(持续更新)
  • 快速入门GitHub 之超简单的注册方法和超好用的使用技巧
  • ESP32-Web-Server编程- 在 Web 上开发动态纪念册