题目:
代码一:
思路:
1)先找到字符串中的大的子串,统计个数 * 对应的数值 -> 加入求和list,找到后用“”空字符替换,
2)再对更小的子串,进行搜索?,最后统计和 sum
class Solution:
def romanToInt(self, s: str) -> int:
roman_dict = {"I": 1,
"V": 5,
"X": 10,
"L": 50,
"C": 100,
"D": 500,
"M": 1000,
}
two_roman_dict = {
"IV": 4,
"IX": 9,
"XL": 40,
"XC": 90,
"CD": 400,
"CM": 900
}
add_item = []
def get_sum(k, v, s):
if k in s:
how_many = s.count(k)
s = s.replace(k, "")
if how_many > 1:
add_item.append(v*how_many)
else:
add_item.append(v)
return add_item, s
# 先替换长的子串,然后加入list, 统计一下出现的次数
for k, v in two_roman_dict.items():
add_item, s = get_sum(k, v, s)
# 短子串
for m, n in roman_dict.items():
add_item, s = get_sum(m, n, s)
return sum(add_item)
第一个程序运行时间: 3.886222839355469e-05
结果: 58
代码二:
思路更牛逼一些:
1)因为都是大的数字在前面,所以利用,如果出现前面数字大于后面的,则它是组合,注意,需要减去中间的那个重复的
2)举例:“MCMXCIV“ --> 注意 加法顺序,先看前面三个字母之和
如果啥不操作,无脑叠加结果是:M + C + M = 2M + C
实际上我们想得到的是: M + (M -C)
所以程序中,我们需要在无脑的结果上 减去2倍的中间值C,才能得到正确结果
M + C + M - 2C --> OK?
class Solution:
def romanToInt(self, s: str) -> int:
roman_dict = {"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 roman_dict[s[i]] > roman_dict[s[i-1]]:
result += roman_dict[s[i]] - 2*roman_dict[s[i-1]]
else:
result += roman_dict[s[i]]
return result
结论:
IDE 结果:
第一个程序运行时间: 2.193450927734375e-05
结果: 1994
第二个程序运行时间: 1.0967254638671875e-05
结果: 1994
总结,多种角度思考问题,加油!⛽️!!