T13 罗马数字转整数
解法一 :
1.根据题目所给的六种情况构建字典
2. 将每种情况取出,构建数组,从大到小排列,方便后面遍历
3.遍历arr_dict 数组,若字符串中包含该元素,则count加上字典中该键的值,然后从字符串中删除该子串,(这里不需要计算子串出现的次数,因为除了题目上说除了那六种情况,其余都是左边大 右边小,所以,同一个特殊字串不可能出现两次)
4. 对剩下的字符进行遍历,累加则为最终结果。
class Solution:
def romanToInt(self, s: str) -> int:
count = 0
dict_ = {"IV":4,"IX":9,"XL":40,"XC":90,"CD":400,"CM":900}
arr_dict = ["CM","CD","XC","XL","IX","IV"]
for i in arr_dict:
if i in s:
count += dict_[i]
print(count)
s = s.replace(i,"")
for i in s:
if i == 'I':
count += 1
elif i == 'V':
count += 5
elif i == 'X':
count += 10
elif i == 'L':
count += 50
elif i == 'C':
count += 100
elif i == 'D':
count += 500
elif i == 'M':
count += 1000
return count
解法二 :
1.构建一个字典记录所有罗马数字子串,注意长度为2的子串记录的值是(实际值 - 子串内左边罗马数字代表的数值)
2.这样一来,遍历整个 s的时候判断当前位置和前一个位置的两个字符组成的字符串是否在字典内,如果在就记录值,不在就说明当前位置不存在小数字在前面的情况,直接记录当前位置字符对应值
class Solution:
def romanToInt(self, s: str) -> int:
d = {'I':1, 'IV':3, 'V':5, 'IX':8, 'X':10, 'XL':30, 'L':50, 'XC':80, 'C':100, 'CD':300, 'D':500, 'CM':800, 'M':1000}
return sum(d.get(s[max(i-1, 0):i+1], d[n]) for i, n in enumerate(s))
解法三(哈希) :
1.通过观察我们发现,只有在遇到特殊情况时,两个字符中左边的字符小于右边的字符,且等于右边的字符代表的数减左边字符代表的数。 比如 CM 等于 1000 - 100 ,XC 等于 100 - 10 …
因此,我们将 字符:数值 存在 Roman2Int 的哈希表中。然后从左到右遍历每个字符,如果 s[i] < s[i+1],就将结果减去 s[i] 代表的数字;否则,将结果加上 s[i] 代表的数字。
class Solution:
def romanToInt(self, s: str) -> int:
dict_= {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
count= 0
n = len(s)
for index in range(n - 1):
if dict_[s[index]] < dict_[s[index + 1]]:
count -= dict_[s[index]]
else:
count += dict_[s[index]]
return count + dict_[s[-1]]