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.pswp.cn/web/92992.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92992.shtml

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

相关文章

计算机网络摘星题库800题笔记 第6章 应用层

第6章 应用层 6.1 网络应用的架构 考点 1 CS 架构 题组闯关 1.DNS 是基于 ( ) 模式的分布式系统。 A. C/S B. B/S C. P2P D. 以上均不正确 1.【参考答案】A 【解析】本题考查网络应用模型。 DNS 作为分布式应用&#xff0c;是一种典型的 C/S 模式&#xff0c;是随着 Internet 技…

BLUCK电路的输入电容应该怎么选取

借用TI的BULK芯片讨论一下输入电容怎么选取的问题&#xff0c;BULK电源是我们常用的电源&#xff0c;它的原理请看之前的文章&#xff1a; 高压差为何不用LDO&#xff1f;DCDC效率更高&#xff01;-CSDN博客 本文我们探讨一下输入电容&#xff0c;输入电容是控制纹波的关键&a…

CAN仲裁机制的原理

我们来详细讲 CAN 仲裁机制 的原理和工作方式,这是 CAN 总线最核心的特性之一。 1️⃣ 基本概念 CAN 总线是 多主机、多节点的串行总线,所有节点共享一根差分信号线(CAN_H / CAN_L)。 每个节点都可以随时发送消息(多主机机制) 总线只能同时有一个节点成功发送 仲裁 用…

【GPT入门】第46课 vllm安装、部署与使用

【GPT入门】第46课 vllm安装、部署与使用 1.准备服务器 2. 安装 conda环境,隔离base环境 3. vllm使用 3.1 在线推理, openai兼容服务器 3.2 模型离线调用 4. 没有使用GPU问题分析 1.准备服务器 cuda 版本选12.1 vllm官网介绍: https://vllm.hyper.ai/docs/getting-started/…

【从网络基础到实战】理解TCP/IP协议体系的核心要点(包含ARP协议等其他协议介绍)

前言&#xff1a; 学习计算机网络不仅是软件开发的基础功&#xff0c;更是成为一名合格后端工程师、网络工程师的重要门槛。本文将基于 TCP/IP 协议体系&#xff0c;系统梳理网络层、数据链路层、以及相关协议的核心知识&#xff0c;并结合实际案例与代码示例帮助理解。一、网络…

Python 元类基础:从理解到应用的深度解析

在 Python 的高级编程中&#xff0c;元类&#xff08;metaclass&#xff09; 无疑是最神秘又最强大的特性之一。它不仅是构建类的“工厂”&#xff0c;更是 Python 灵活对象模型的体现。本文将带你从基础概念入手&#xff0c;深入理解元类的本质、工作机制以及实际应用&#xf…

Nginx 配置代理服务器的详细方法

一、什么是代理服务器&#xff1f; 类型说明正向代理客户端通过代理访问目标服务器&#xff08;隐藏客户端身份&#xff09;反向代理客户端访问代理服务器&#xff0c;由代理服务器请求后端服务器&#xff08;隐藏后端服务器&#xff09; 二、Nginx 反向代理配置方法&#xff…

Lombok插件介绍及安装(Eclipse)

一、Lombok 的用途 Lombok是一个 Java 库&#xff0c;通过注解的方式简化 Java 代码的编写。它能够自动生成常见的代码&#xff0c;如getter、setter、toString、equals、hashCode等方法&#xff0c;从而减少样板代码&#xff0c;使代码更加简洁、易读。 Lombok 通过添加**Dat…

硬核操作!Go 语言生成 “会爬墙的清洁机器人”,玻璃外墙自己擦

本文聚焦于利用 Go 语言开发 “会爬墙的清洁机器人” 这一硬核技术&#xff0c;围绕该机器人如何实现玻璃外墙自主清洁展开。首先介绍开发背景与需求&#xff0c;接着阐述 Go 语言在其中的优势&#xff0c;详细讲解机器人的核心技术&#xff0c;包括吸附系统、运动控制、清洁机…

Qt——实现”Hello World“、认识对象树与Qt坐标系

在创建项目时&#xff0c;使用的基类Base Class为QWidget 1. 使用图形化界面的方式实现“Hello World” 双击文件&#xff1a;widget.ui&#xff0c;进入designer模式&#xff1a;在“控件盒子”的“Display Widgets”中找到“Label”&#xff0c;并拖放到白板中双击刚刚拖放到…

智能合约开发全流程实战指南

目录 灵感探索与概念验证合约开发常见问题 Hardhat 初始化项目问题合约编译错误处理智能合约设计缺陷 合约测试最佳实践 单元测试环境配置测试用例编写技巧测试覆盖率和策略常见测试失败原因 合约部署实战指南 部署到不同网络部署前准备事项部署后验证方法部署费用和Gas优化 合…

IPA1299至为芯替代TI ADS1299的脑机接口芯片

在脑机接口、神经科学研究和医疗电子设备领域&#xff0c;脑电信号采集芯片是连接生物电信号与数字世界的重要组件。目前&#xff0c;TI等国际厂商凭借技术优势占据市场主要份额&#xff0c;国内厂商在成本控制、供货周期和技术自主性方面面临挑战。英集芯推出的IPA1299低噪声多…

「数据获取」《中国海洋生态环境状况公报》(2001-2023年)(获取方式看绑定的资源)

01、数据简介在 2023 年的海洋环境监测工作中&#xff0c;监测范围广泛且细致。全年对 1359 个海洋环境质量国家控制点位进行了水质监测&#xff0c;这些点位分布在我国管辖的各大海域&#xff0c;能够全面反映海洋整体水质状况&#xff1b;对 230 个入海河流国家控制断面开展监…

通过限制网络访问来降低服务器被攻击风险的方法

限制网络访问是降低服务器被攻击风险的核心思路之一&#xff0c;因为绝大多数入侵都是从开放的网络入口开始的。思路是“减少暴露面 精确授权”&#xff0c;让服务器只对必要的人、必要的业务开放。我给你分成几个层次来说明&#xff0c;从最外层网络入口到最内层系统配置都涉…

python与JavaScript的区别

Python 与 JavaScript 的主要区别&#xff08;按常用维度划分&#xff09;维度PythonJavaScript诞生时间 / 背景1991 年&#xff0c;由 Guido van Rossum 设计&#xff0c;目标是“一种易读、易写的通用脚本语言”。1995 年&#xff0c;由 Brendan Eich 为 Netscape 浏览器诞生…

Java 比较器解析

一、比较器的核心作用与应用场景在 Java 编程中&#xff0c;数据比较是一个基础但重要的操作。对于基本数据类型&#xff08;如 int、double、boolean、char 等&#xff09;&#xff0c;Java 语言本身就提供了完整的比较运算符&#xff08;>、<、、>、<、!&#xf…

Java学习第一百二十一部分——HTTP

目录 一、前言简介 二、核心特性 三、通信基础结构 四、关键组件详解 五、性能演进——版本对比 六、开发者建议 七、总结归纳 一、前言简介 HTTP&#xff08;“H”yper“t”ext “T”ransfer “P”rotocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最广泛…

记录RK3588的docker中启动rviz2报错

安装好rk3588 的docker&#xff0c;pull了ros的完整镜像后&#xff0c;想要启动rviz但是报错&#xff0c;下面是我的踩坑记录 0.原始的启动镜像的脚本&#xff1a; sudo docker run -it --rm --privileged --nethost -e DISPLAY$DISPLAY --namemy_image_name \-e DISPLAY$DIS…

ThingJS 新手学习技巧

一、ThingJS 基础认知 1.1 ThingJS 是什么 ThingJS 是一款基于 WebGL 技术的 3D 可视化开发平台&#xff0c;它为开发者提供了简单易用的 API 和丰富的 3D 场景组件&#xff0c;让开发者能够快速构建出高质量的 3D 可视化应用。无论是智慧园区、智慧楼宇、智慧交通还是工业监…

【软考架构】需求工程中,系统分析与设计的结构化方法

结构化方法诞生于20世纪70年代&#xff0c;是为了应对当时日益复杂的软件系统开发挑战&#xff08;如“软件危机”&#xff09;而提出的。它强调系统性、规范性、分解和抽象&#xff0c;目标是提高软件开发的效率、质量和可维护性&#xff0c;降低复杂性。 核心思想&#xff1a…