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

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

题目描述

罗马数字包含以下七种字符: I, V, X, L, C, DM。每个字符对应的数值如下:

字符数值
I1
V5
X10
L50
C100
D500
M1000

例如:

  • 罗马数字 2 写作 II,即两个 1 的并列。
  • 数字 12 写作 XII,即 X + II
  • 数字 27 写作 XXVII,即 XX + V + II
特殊规则

在罗马数字中,小的数字通常写在大的数字右边,但是有一些例外情况:

  • 4 不写作 IIII,而是写作 IV。这是因为 IV 左边,表示 5 - 1 = 4
  • 9 表示为 IX,表示 10 - 1 = 9
  • 其他的特例还包括:
    • X 可以放在 L (50) 和 C (100) 左边表示 40 和 90。
    • C 可以放在 D (500) 和 M (1000) 左边表示 400 和 900。

思路分析

转换罗马数字到整数的思路主要遵循以下步骤:

  1. 根据字符和数值的映射关系,把每个字符对应的数值取出来。
  2. 从左到右遍历罗马数字字符串:
    • 如果某个字符对应的数值小于下一个字符的数值,说明需要用减法(如 IV 表示 4)。
    • 否则,就把当前字符对应的数值加到结果中。

代码实现

如果你不知道unordered_map的用法可以看我另外一篇文章

  • 【编程语言】在C++中使用map与unordered_map
#include "bits/stdc++.h"using namespace std;class Solution {
public:int romanToInt(string s) {unordered_map<char, int> map = {{'I', 1},{'V', 5},{'X', 10},{'L', 50},{'C', 100},{'D', 500},{'M', 1000}};int ans = 0;for (int i = 0; i < s.size(); i++) {int n = map[s[i]];if (i + 1 < s.size() && map[s[i + 1]] > n) {ans -= n;} else {ans += n;}}return ans;}
};int main() { Solution s;cout << s.romanToInt("III") << endl;return 0; 
}

代码讲解

  1. 字符映射:我们用 unordered_map 来映射每个罗马字符到对应的数值。这样可以在 O(1) 时间内查询每个字符的数值。
  2. 遍历字符串:我们逐个遍历字符串的每一个字符。对于每个字符:
    • 如果当前字符的数值比下一个字符小,则减去该字符的数值。
    • 否则,将该字符的数值加到最终结果中。
  3. 返回结果:循环结束后,得到的结果就是转换后的整数。

时间复杂度和空间复杂度

  • 时间复杂度: O(n),其中 n 是罗马数字字符串的长度。每个字符只需要遍历一次,查找字符映射也是 O(1)。
  • 空间复杂度: O(1),因为我们只使用了一个固定大小的哈希表来存储字符映射,所需空间不会随输入大小变化。

其他实现方式

除了使用哈希表,也可以直接使用 switch 语句,但这样会使代码更长,不够简洁。同时,哈希表的方式在处理大规模数据时具备更好的灵活性。

总结

本题通过简单的规则遍历实现了罗马数字的转换。这个方法思路清晰,适合初学者掌握,也能帮助理解字符串处理中的一些基本逻辑。


http://www.mrgr.cn/news/63848.html

相关文章:

  • 分享几款开源好用的图片在线编辑,适合做快速应用嵌入
  • 安科瑞AMB400分布式光纤测温系统解决方案--远程监控、预警,预防电气火灾
  • 使用Postman进行API测试
  • go语言结构体与json数据相互转换
  • C02S04-Ubuntu基本使用
  • D4--绝对值不等式及其他贪心问题
  • 微服务之间的调用关系
  • 红帽认证系列之二:红帽认证专家(RHCX)详解
  • 深入理解 MySQL 中的日志类型及其应用场景
  • SQLI LABS | Less-24 POST-Second Oder Injections Real Treat-Stored Injections
  • Python中什么是迭代器,如何创建迭代器?
  • DICOM标准:解析DICOM属性中的病人模块
  • 大数据治理
  • C语言 | Leetcode C语言题解之第525题连续数组
  • Ubuntu下载ISO镜像的方法
  • 【挑战全网最清晰!】IBM Rational Rose如何导出高清图片 | 如何导出成形状 | 如何导出到PPT
  • mybatis-plus
  • Golang | Leetcode Golang题解之第526题优美的排列
  • QEMU学习之路(4)— Xilinx开源项目systemctlm-cosim-demo安装与使用
  • [运维] 服务器本地网络可用性检查脚本
  • 信息学奥赛一本通 1393:联络员(liaison)
  • OpenEmbedded、yocto和poky是什么关系?
  • 计算机后台服务-更新下载,重启————未来之窗行业应用跨平台架构
  • Object类中的方法
  • *指针引用
  • 双指针习题篇(下)