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

LeetCode 面试经典 150_数组/字符串_整数转罗马数字(18_12_C++_中等)(模拟)(对各位进行拆解)

LeetCode 面试经典 150_数组/字符串_整数转罗马数字(18_12_C++_中等)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(模拟):
        • 思路二(对各位进行拆解):
      • 代码实现
        • 代码实现(思路一(模拟)):
        • 代码实现(思路二(对各位进行拆解)):
        • 以思路一为例进行调试

题目描述:

七个不同的符号代表罗马数字,其值如下:

字符数值
I1
V5
X10
L50
C100
D500
M1000

罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:

如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式
给定一个整数,将其转换为罗马数字。

输入输出样例:

示例 1:
输入:num = 3749
输出:“MMMDCCXLIX”
解释
3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC 由于 500 (D) + 100 (C ) + 100 (C )
40 = XL 由于 50 (L) 减 10 (X)
9 = IX 由于 10 (X) 减 1 (I)
注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位

示例 2:
输入:num = 58
输出:“LVIII”
解释
50 = L
8 = VIII

示例 3:
输入:num = 1994
输出:“MCMXCIV”
解释
1000 = M
900 = CM
90 = XC
4 = IV

提示:
1 <= num <= 3999

题解:

解题思路:

思路一(模拟):

1、将整数与罗马数字的对应关系列列出来。
{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”}
: 假设 num = 58

  • 先检查是否大于或等于 1000
  • 再检查是否大于或等于 900
  • 再检查是否大于或等于 500
  • 再检查是否大于或等于 400
  • 再检查是否大于或等于 100
  • 再检查是否大于或等于 90
  • 再检查是否大于或等于 50,减去 50,结果 num = 8,添加 “L”。
  • 再检查是否大于或等于 40
  • 再检查是否大于或等于 10
  • 再检查是否大于或等于 9
  • 再检查是否大于或等于 5,减去 5,结果 num = 3,添加 “V”。
  • 再检查是否大于或等于 4
  • 再检查是否大于或等于 1,减去 1,结果 num = 2,添加 “I”。减去 1,结果 num = 1,添加 “I”。减去 1,结果 num = 1,添加 “I”。

2、复杂度分析:
① 时间复杂度:O(1),因循环执行次数有限。
② 空间复杂度:O(1)。

思路二(对各位进行拆解):

1、因 1 <= num <= 3999,所以可以建立一个 千位、百位、十位、个位的对应关系
千位 = {“”, “M”, “MM”, “MMM”}
百位 = {“”, “C”, “CC”, “CCC”, “CD”, “D”, “DC”, “DCC”, “DCCC”, “CM”}
十位 = {“”, “X”, “XX”, “XXX”, “XL”, “L”, “LX”, “LXX”, “LXXX”, “XC”}
个位 = {“”, “I”, “II”, “III”, “IV”, “V”, “VI”, “VII”, “VIII”, “IX”}

2、复杂度分析
① 时间复杂度:O(1)。
② 空间复杂度:O(1)。

代码实现

代码实现(思路一(模拟)):
class Solution1 {
public:string intToRoman(int num) {// 定义一个常量数组 valueSymbols,其中每个元素是一个pair<int, string>// 存储的是整数和对应的罗马数字符号对const pair<int,string> valueSymbols[]= {{1000, "M"},     // 1000 对应 "M"{900,  "CM"},    // 900 对应 "CM"{500,  "D"},     // 500 对应 "D"{400,  "CD"},    // 400 对应 "CD"{100,  "C"},     // 100 对应 "C"{90,   "XC"},    // 90 对应 "XC"{50,   "L"},     // 50 对应 "L"{40,   "XL"},    // 40 对应 "XL"{10,   "X"},     // 10 对应 "X"{9,    "IX"},    // 9 对应 "IX"{5,    "V"},     // 5 对应 "V"{4,    "IV"},    // 4 对应 "IV"{1,    "I"},     // 1 对应 "I"};string roman = "";  // 用于保存最终的罗马数字字符串// 当 num > 0 时继续循环,将 num 转换为罗马数字while (num > 0) {// 遍历 valueSymbols 数组,按照从大到小的顺序检查每个值for (const auto &[value, symbol] : valueSymbols) {   //结构化绑定只能在-std=c++17中使用// 如果当前的 num 大于或等于该值,则减去该值,并将相应的符号添加到结果字符串中while (num >= value) {num -= value;       // 从 num 中减去该值roman += symbol;    // 将符号添加到 roman 字符串中}}}// 返回最终生成的罗马数字字符串return roman;}
};
代码实现(思路二(对各位进行拆解)):
class Solution2 {
public:string intToRoman(int 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"};return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];}
};
以思路一为例进行调试
#include<iostream>
using namespace std;class Solution1 {
public:string intToRoman(int num) {// 定义一个常量数组 valueSymbols,其中每个元素是一个pair<int, string>// 存储的是整数和对应的罗马数字符号对const pair<int,string> valueSymbols[]= {{1000, "M"},     // 1000 对应 "M"{900,  "CM"},    // 900 对应 "CM"{500,  "D"},     // 500 对应 "D"{400,  "CD"},    // 400 对应 "CD"{100,  "C"},     // 100 对应 "C"{90,   "XC"},    // 90 对应 "XC"{50,   "L"},     // 50 对应 "L"{40,   "XL"},    // 40 对应 "XL"{10,   "X"},     // 10 对应 "X"{9,    "IX"},    // 9 对应 "IX"{5,    "V"},     // 5 对应 "V"{4,    "IV"},    // 4 对应 "IV"{1,    "I"},     // 1 对应 "I"};string roman = "";  // 用于保存最终的罗马数字字符串// 当 num > 0 时继续循环,将 num 转换为罗马数字while (num > 0) {// 遍历 valueSymbols 数组,按照从大到小的顺序检查每个值for (const auto &[value, symbol] : valueSymbols) {   //结构化绑定只能在-std=c++17中使用// 如果当前的 num 大于或等于该值,则减去该值,并将相应的符号添加到结果字符串中while (num >= value) {num -= value;       // 从 num 中减去该值roman += symbol;    // 将符号添加到 roman 字符串中}}}// 返回最终生成的罗马数字字符串return roman;}
};int main(int argc, char const *argv[])
{int num=3749;Solution1 s;cout<<s.intToRoman(num)<<endl;return 0;
}

LeetCode 面试经典 150_数组/字符串_整数转罗马数字(18_12)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

http://www.xdnf.cn/news/1290889.html

相关文章:

  • STM32HAL 快速入门(六):GPIO 输入之按键控制 LED
  • JMeter 测试 WebSocket 接口的详细教程
  • HarmonyOS NDK的JavaScript/TypeScript与C++交互机制
  • 实战多屏Wallpaper壁纸显示及出现黑屏问题bug分析-学员作业
  • 从0开始配置conda环境并在PyCharm中使用
  • 基于Apache Flink的实时数据处理架构设计与高可用性实战经验分享
  • Flink中的窗口
  • 解决程序连不上RabbitMQ:Attempting to connect to/access to vhost虚拟主机挂了的排错与恢复
  • Windows也能用!Claude Code硬核指南
  • 【报错解决】Conda - Downloaded bytes did not match Content-Length
  • Java零基础笔记16(Java编程核心:存储读写数据方案—File文件操作、IO流、IO框架)
  • 搜索引擎核心机制解析
  • 5.0.9.1 C# wpf通过WindowsFormsHost嵌入windows media player(AxInterop.WMPLib)
  • C# WPF本地Deepseek部署
  • 集成电路学习:什么是CV计算机视觉
  • IPA1299至为芯替代TI ADS1299的脑机接口芯片
  • 网络安全合规6--服务器安全检测和防御技术
  • 高级IO(五种IO模型介绍)
  • Spring、Spring MVC、Spring Boot与Spring Cloud的扩展点全面梳理
  • Spring Boot 集成 机器人指令中枢ROS2工业机械臂控制网关
  • 从“存得对”到“存得准”:MySQL 数据类型与约束全景指南
  • 算法题打卡力扣第11题:盛最多水的容器(mid)
  • 音视频处理新纪元:12款AI模型的语音转录和视频理解能力横评
  • 洛谷 P2607 [ZJOI2008] 骑士-提高+/省选-
  • 从钢板内部应力视角,重新认识护栏板矫平机
  • 猫头虎AI分享| 智谱开源了为 RL scaling 设计的 LLM post‑training 框架用于GLM-4.5强化学习训练:slime
  • 深入解析C语言嵌套结构体的内存管理与操作实践
  • 基于CNN与Transformer的无人机应急救援网络异常流量检测
  • 在前端js中使用jsPDF或react-to-pdf生成pdf文件时,不使用默认下载,而是存储到服务器
  • SQL详细语法教程(一)--数据定义语言(DDL)