LeetCode 题解工作台
罗马数字转整数
罗马数字包含以下七种字符: I , V , X , L , C , D 和 M 。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1 。 12 写做 XII ,即为 X + II 。 27 写做 XXVII …
3
题型
11
代码语言
3
相关题
当前训练重点
简单 · 哈希·数学
答案摘要
我们先用哈希表 记录每个字符对应的数值,然后从左到右遍历字符串 ,如果当前字符对应的数值小于右边字符对应的数值,则减去当前字符对应的数值,否则加上当前字符对应的数值。 时间复杂度 ,空间复杂度 。其中 和 分别为字符串 的长度和字符集的大小。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 哈希·数学 题型思路
题目描述
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值 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:
输入: s = "III" 输出: 3
示例 2:
输入: s = "IV" 输出: 4
示例 3:
输入: s = "IX" 输出: 9
示例 4:
输入: s = "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3.
示例 5:
输入: s = "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= s.length <= 15s仅含字符('I', 'V', 'X', 'L', 'C', 'D', 'M')- 题目数据保证
s是一个有效的罗马数字,且表示整数在范围[1, 3999]内 - 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
- IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
- 关于罗马数字的详尽书写规则,可以参考 罗马数字 - 百度百科。
解题思路
方法一:哈希表 + 模拟
我们先用哈希表 记录每个字符对应的数值,然后从左到右遍历字符串 ,如果当前字符对应的数值小于右边字符对应的数值,则减去当前字符对应的数值,否则加上当前字符对应的数值。
时间复杂度 ,空间复杂度 。其中 和 分别为字符串 的长度和字符集的大小。
class Solution:
def romanToInt(self, s: str) -> int:
d = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
return sum((-1 if d[a] < d[b] else 1) * d[a] for a, b in pairwise(s)) + d[s[-1]]
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | Depends on the final approach |
| 空间 | Depends on the final approach |
面试官常问的追问
外企场景- question_mark
Do you understand how the subtraction rule works in Roman numerals?
- question_mark
Can you efficiently solve the problem using both a hash table and mathematical principles?
- question_mark
Will you be able to handle edge cases like 'IX' or 'CM' during the interview?
常见陷阱
外企场景- error
Misunderstanding the subtraction rule, such as treating 'IV' as 'IIII' or incorrectly handling cases like 'IX'.
- error
Failing to account for the correct direction in which to iterate through the string, leading to errors in subtraction logic.
- error
Not properly using the hash table, which could result in inefficient symbol lookups or errors in mapping values.
进阶变体
外企场景- arrow_right_alt
Convert a Roman numeral string to an integer using a recursive approach.
- arrow_right_alt
Extend the solution to support Roman numerals in the range from 1 to 5000.
- arrow_right_alt
Implement an optimized version of the solution that minimizes space complexity.