通过自己的写法需要明白的是:小数字表示的字符在大数字前边表示的数为减去前边的罗马数字表示的小数字所得到的数,例如IV=4,CD=400,CM=900
这时候可以用一个循环表示,前提为这个字符串存在,索引i不能超过字符串长度,而且当前位置的罗马字马表示的数字必后一个小的话说明这是一个特殊组合,我们先用Python把每个字母和整数的映射关系,然后定义一个新的数字用来存储遍历中的数字,接下来进行遍历
代码(完整):
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
# 定义罗马数字与整数的映射关系
roman_map = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
result = 0
# 遍历字符串
for i in range(len(s)):
# 如果当前字符对应的数值小于下一个字符对应的数值,进行减法操作
if i < len(s) - 1 and roman_map[s[i]] < roman_map[s[i + 1]]:
result -= roman_map[s[i]]
else:
result += roman_map[s[i]]
return result
if __name__ == "__main__":
input_roman = input("请输入一个罗马数字: ")
solution = Solution()
integer_result = solution.romanToInt(input_roman)
print(f"对应的整数是: {integer_result}")
在进行比较充分的解释后对比大佬的代码发现思路差不太多,但是特别占内存
大佬代码(优化版):
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
# 定义罗马数字字符到整数的映射字典
numeral_map = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
# 初始化结果变量,用于存储最终转换得到的整数
result = 0
# 遍历输入的罗马数字字符串中的每个字符
for i in range(len(s)):
# 判断当前字符不是第一个字符,并且当前字符对应的数值大于前一个字符对应的数值
if i > 0 and numeral_map[s[i]] > numeral_map[s[i - 1]]:
# 若是特殊组合(小数字在大数字左边),执行该逻辑
# 因为前一个字符在上一轮循环已被加过一次,所以这里减去 2 倍的前一个字符对应的值
result = result + numeral_map[s[i]] - 2 * numeral_map[s[i - 1]]
else:
# 若不是特殊组合,直接将当前字符对应的数值累加到结果中
result += numeral_map[s[i]]
return result