LeetCode罗马数字转整数问题:字符串字符映射对应数值方法咨询
罗马数字转整数:字符映射问题
问题描述
我正在解决LeetCode中的罗马数字转整数问题,已为每个罗马字符单独赋值(如I=1、V=5等),使用map函数获取到了输入字符串的单个字符列表。例如输入:
Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
目前得到的是字符串形式的字符列表(如['L', 'V', 'I', 'I', 'I']),需要将这类字符串形式的罗马字符对应到预先定义的数值(例如将"L"映射为50)。
当前代码
I = 1 V = 5 X = 10 L = 50 C = 100 D = 500 M = 1000 s = "LVIII" length = len(s) numbers = list(map(list, s)) x = 0 while x < length: print(numbers[x]) x = x + 1
解决方案
核心思路:用字典替代单独变量存储映射关系
单独的变量(如L=50)无法通过字符串"L"直接获取对应数值,而字典的键值对结构正好适配这种字符到数值的映射需求,能通过字符串形式的罗马字符直接拿到对应的值。
基础映射实现代码
# 定义罗马字符到整数的映射字典 roman_map = { 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000 } s = "LVIII" total = 0 # 遍历字符串中的每个字符,累加对应数值 for char in s: total += roman_map[char] print(total) # 输出:58
完整LeetCode问题解决方案
罗马数字存在特殊规则:当一个较小的数值出现在较大数值左侧时,需要用大值减去小值(如IV=4、IX=9)。以下是适配该规则的完整代码:
roman_map = { 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000 } s = "LVIII" total = 0 n = len(s) for i in range(n): # 若当前字符不是最后一个,且当前值小于下一个值,则减去当前值 if i < n - 1 and roman_map[s[i]] < roman_map[s[i+1]]: total -= roman_map[s[i]] else: total += roman_map[s[i]] print(total) # 输出:58
额外优化说明
- 无需使用
list(map(list, s))处理字符串:Python字符串本身是可迭代对象,直接遍历即可拿到每个单个字符。 - 字典的查找时间复杂度为O(1),相比其他方式效率更高,适合处理这类映射需求。
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

