一.解题思路
思路:这题本人做法比较常规,略有些偷懒。将非重复的组合先列好在字典中,然后循环判断字典中的key是否出现在字符串中,若出现则累加数值,之后将字符串中的对应key删除
参考:这里我也参考了别人不错(不偷懒)的做法,就是按照题目规则:将字符串里前一位与后一位字符比大小,若前一位小于后一位那么则减前一位,反之则加前一位。
二.代码展示
# 自己的解法
class Solution:
def romanToInt(self, s):
# 记录累加值
res = 0
# 规则字典
rule = {'CM': 900, 'CD': 400, 'XC': 90, 'XL': 40, 'IX': 9, 'IV': 4, 'M': 1000,
'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1}
# 循环整个字典
for key, value in rule.items():
# 如果字典中的key在字符串s中有出现则进入
if key in s:
# 统计字典中的key在字符串中出现的次数。例如:III 是 1*3=3
key_count = s.count(key)
# 计算累加值
res += (value * key_count)
# 字符串替换,将计算过的符号替换为空字符串
s = s.replace(key, '', key_count)
# 如果字符串s为空字符串后说明计算完成
if s == '':
break
return res
# 这是参考别人的解法
class Solution:
def romanToInt2(self, s):
# 记录累加值
res = 0
# 规则字典
rule = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
# 记录字符串长度
s_len = len(s)
# 循环字符串长度减1次(因为需要判断字符串前一位与后一位字符对应规则字典的大小关系,不减1的话最后一位字符是没有下一位的)
for index in range(s_len - 1):
# 判断第一位字符是否小于第二位(按照规则如果前一位字符比后一位字符小则减前一位,否则加前一位)
if rule[s[index]] < rule[s[index+1]]:
res -= rule[s[index]]
else:
res += rule[s[index]]
# 最后返回累加值时需要注意,把字符串最后一位加上
return res + rule[s[-1]]
三.总结其他
总结:这题我认为我参考的那位兄弟的解法很优雅,因为很符合题目要求,也不用在字典里放入其他额外的组合之类的。自己写的那个在我看来算是偷懒吧,直接把可能的组合放入字典了,感觉挺多余的。
期望:好好学习优秀的源码,提升自己,让自己也能写出优雅的代码。