罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 示例 1: 输入: "III" 输入: "IV" 输入: "IX" 输入: "LVIII" 输入: "MCMXCIV" 来源:力扣(LeetCode) |
python 数组越界的问题
>>> list1 = [1, 2, 3] >>> list1[0:1]
python知识点 1.去掉空格 字符串去掉左侧空格:s.lstrip() 字符串去掉右侧空格:s.rstrip() 去掉左右两边空格:s.strip() 去掉所有空格:s.replace(" ", "") 正则表达式将空格替换成空 :str_new = re.sub(r"\s+", "", s) 2.新建字典 >>>dict = {'a': 1, 'b': 2, 'b': '3'} 3.遍历字典 dic1 = {'date':'2018.11.2','name':'carlber','work':"遍历",'number':3} for i in dic1: #遍历字典中的键 print(i) for key in dic1.keys(): print(key) for value in dic1.values(): #遍历字典中的值 print(value) for item in dic1.items(): #遍历字典中的元素 print(item) for i in dic1: print("该次循环得到的key为%s,得到的值为%s"%(i,dic1[i])) |
'''
安安思路
"MCMXCIV"
遍历字符串
处理当前字符时和前一个字符连接,判断是否符合特殊情况
如果不符合,先把这个符号对应的数值加上
如果符合,要先把上一个的那个数值减掉,再对应特殊字符对应的数值加上
'''
class Solution:
def romanToInt(self, s: str) -> int:
dict1 = {
"I":1,
"V":5,
"X":10,
"L":50,
"C":100,
"D":500,
"M":1000
}
special_case = {
"IV":4,
"IX":9,
"XL":40,
"XC":90,
"CD":400,
"CM":900
}
sum = 0
tmp = 0
pre = ""
for i in range(len(s)):
s_tmp = pre+s[i]
pre = s[i]
#print("s_tmp:" + s_tmp)
if s_tmp in special_case.keys():
sum-=tmp
tmp = special_case[s_tmp]
pre = ""
sum+=tmp
continue
else:
tmp = dict1[s[i]]
sum+=tmp
#print("tmp:%d" % tmp)
#print("sum: %d" %sum)
#print("***")
return sum
自己解法的不足:
1.可以将两个字典进行合并,没有必要用两个
2.自己判断的是当前字符和前一个字符,前一个字符不用再用一个变量表示,直接用s[i-1]表示即可
3.第一个字符和最后一个字符如何判断,出现越界怎么办 见下面
#看了题解之后自己写的代码
class Solution:
def romanToInt(self, s: str) -> int:
dict1 = {
"I":1,
"V":5,
"X":10,
"L":50,
"C":100,
"D":500,
"M":1000,
"IV":4,
"IX":9,
"XL":40,
"XC":90,
"CD":400,
"CM":900
}
sum = 0
i = 0
while(i < len(s)):
if s[i:i+2] in dict1.keys():
sum+=dict1[s[i:i+2]]
i+=2
elif s[i] in dict1.keys():
sum+=dict1[s[i]]
i+=1
#print(sum)
return sum
自己担心这个问题会出现最后一个字符越界的情况,结果并没有 见下
>>> list1 = [1, 2, 3]
>>> list1
[1, 2, 3]
>>> list1[1]
2
>>> list1[3]
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
list1[3]
IndexError: list index out of range
>>> list1[0:1]
[1]
>>> list1[2:3]
[3]
>>> list1[3:4]
[]
>>> list1[-1:0]
[]
'''
还是自己之前的思路,只不过进行了调整
遍历字符串
处理当前字符时和前一个字符连接,判断是否符合特殊情况
如果不符合,先把这个符号对应的数值加上
如果符合,要先把上一个的那个数值减掉,再对应特殊字符对应的数值加上
要注意第一个字符的特殊情况
'''
class Solution:
def romanToInt(self, s: str) -> int:
dict1 = {
"I":1,
"V":5,
"X":10,
"L":50,
"C":100,
"D":500,
"M":1000,
"IV":4,
"IX":9,
"XL":40,
"XC":90,
"CD":400,
"CM":900
}
sum = 0
for i in range(len(s)):
if (i != 0) and (s[i-1:i+1] in dict1.keys()):
sum-=dict1[s[i-1]]
sum+=dict1[s[i-1:i+1]]
else:
sum+=dict1[s[i]]
return sum