# **Leetcode筆記(Roman to Integer)**
:::info
:information_source: 題目 : Roman to Integer, 類型 : math , 等級 : easy
日期 : 2023/06/14,2023/10/18,2023/11/20,2023/12/10
:::
### 嘗試
2023/10/18
```python
class Solution:
def romanToInt(self, s: str) -> int:
record = {"I" : 1, "V" : 5, "X" : 10, "L" : 50, "C" : 100, "D" : 500, "M" : 1000}
res = record[s[0]]
for i in range(1, len(s)):
cur = record[s[i]]
pre = record[s[i - 1]]
if pre < cur:
res -= 2 * pre # because in the previous time
# we had add pre once already
res += cur
return res
```
2023/11/20
```python
class Solution:
def romanToInt(self, s: str) -> int:
hashmap = {"I" : 1, "V" : 5, "X" : 10, "L" : 50, "C" : 100, "D" : 500, "M" : 1000, "None" : 0}
pre = "None"
res = 0
for c in s:
cur = c
if hashmap[pre] < hashmap[cur]:
res -= 2 * hashmap[pre]
res += hashmap[c]
pre = c
return res
```
2023/12/10
```python
class Solution(object):
def romanToInt(self, s):
hashmap = {"I" : 1, "V" : 5, "X" : 10, "L" : 50, "C" : 100, "D" : 500, "M" : 1000}
res = 0
for i, c in enumerate(s):
if i >= 1 and hashmap[s[i - 1]] < hashmap[c]:
res += (hashmap[c] - hashmap[s[i - 1]] * 2)
continue
res += hashmap[c]
return res
```
---
### **優化**
用倒敘想,如果pre小於cur,代表不符合規則,代表這個數(比較小的那個pre)要被減掉
如果pre大於cur,代表符合規則,那就加上
初始化要先把最後一位加進來
提供的程式碼的時間和空間複雜度如下:
時間複雜度:O(n)
空間複雜度:O(1)
- 字典的空間使用是固定的
- 程式碼還使用一些變量來存儲中間結果
- 因此,空間複雜度是常量的,不取決於輸入的大小。
```python
class Solution:
def romanToInt(self, s: str) -> int:
record = {"I" : 1, "V" : 5, "X" : 10, "L" : 50, "C" : 100, "D" : 500, "M" : 1000}
res = record[s[-1]] # 初始化最後一個
for i in range(len(s) - 1, 0, -1):
cur = record[s[i]]
pre = record[s[i - 1]]
res += -pre if cur > pre else pre
return res
```
---
**:warning: 錯誤語法**
:::warning
:::
**:thumbsup:學習**
:::success
:::
**思路**
**講解連結**
https://blog.csdn.net/coder_orz/article/details/51448537
Provided by. coder_orz
###### tags: `math` `easy` `leetcode`