You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:20:29