>[success] . 羅馬數字轉整數
~~~
1.羅馬數字包含以下七種字符:I, V, X, L,C,D 和 M。
2.字符 數值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
3. 例如, 羅馬數字 2 寫做 II ,即為兩個并列的 1。12 寫做 XII ,即為 X + II 。 27 寫做 XXVII, 即為 XX + V + II 。
通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等于大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 IX。這個特殊的規則只適用于以下六種情況:
I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。
給定一個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的范圍內。
~~~
>[danger] ##### 解析
~~~
1.循環長度-1,無論長度奇偶,都只能循環到倒數第二位
2.IX 根據題意是 X-I 實際 也就是-I+X
3.注釋一根據第一條定律,所以比較當前項和后一項的值大小,保證不會出現溢出的情況,如果大于加當前項
4.如果小于就從和中減去當前項
5.由于循環整理加減都是停留在倒數第二項,所以最后的結果加上最后一項
~~~
~~~
class Solution(object):
def romanToInt(self, s):
sum=0
convert={'M': 1000,'D': 500 ,'C': 100,'L': 50,'X': 10,'V': 5,'I': 1}
for i in range(len(s)-1):
# 注釋一
if convert[s[i]]<convert[s[i+1]]:
sum=sum-convert[s[i]]
# 注釋二
else:
sum=sum+convert[s[i]]
# 注釋三
return sum+convert[s[-1]]
~~~
* 第一的解法
~~~
1.對每一個字符串 比較,循環每一個字符串,別切記錄上一個字符串的值
2.每次循環記錄當前值到last_num,下次循環這個值就變成了上一次的值
3.至于為什么要減去上一次值2倍,舉例例如 VIV 實際 公式V-I+V ,由于我們每次都做了比較,
如果上一次的差不減倍,就變成了V+I+V-I, 而實際IV 才是一個整體,然而IV 中的I 和第一個
V 做了 運算,這里我們就要減去 實際V+I+V-I-I,這種只會出現在 小大的數,所以做差減去2倍
~~~
~~~
def romanToInt(s):
"""
:type s: str
:rtype: int
"""
roman_map = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
# 記錄總和
result = 0
# 記錄上一次值
last_num = None
for char in s:
# 獲取當前值
current_num = roman_map[char]
if last_num is None or last_num >= current_num:
result += current_num
elif last_num < current_num:
result += current_num - 2 * last_num
# 記錄當前值在上一次值變量中,這樣下次循環就變成了上一次值
last_num = current_num
return result
~~~
- 接觸數據結構和算法
- 數據結構與算法 -- 大O復雜度表示法
- 數據結構與算法 -- 時間復雜度分析
- 最好、最壞、平均、均攤時間復雜度
- 基礎數據結構和算法
- 線性表和非線性表
- 結構 -- 數組
- JS -- 數組
- 結構 -- 棧
- JS -- 棧
- JS -- 棧有效圓括號
- JS -- 漢諾塔
- 結構 -- 隊列
- JS -- 隊列
- JS -- 雙端隊列
- JS -- 循環隊列
- 結構 -- 鏈表
- JS -- 鏈表
- JS -- 雙向鏈表
- JS -- 循環鏈表
- JS -- 有序鏈表
- 結構 -- JS 字典
- 結構 -- 散列表
- 結構 -- js 散列表
- 結構 -- js分離鏈表
- 結構 -- js開放尋址法
- 結構 -- 遞歸
- 結構 -- js遞歸經典問題
- 結構 -- 樹
- 結構 -- js 二搜索樹
- 結構 -- 紅黑樹
- 結構 -- 堆
- 結構 -- js 堆
- 結構 -- js 堆排序
- 結構 -- 排序
- js -- 冒泡排序
- js -- 選擇排序
- js -- 插入排序
- js -- 歸并排序
- js -- 快速排序
- js -- 計數排序
- js -- 桶排序
- js -- 基數排序
- 結構 -- 算法
- 搜索算法
- 二分搜索
- 內插搜索
- 隨機算法
- 簡單
- 第一題 兩數之和
- 第七題 反轉整數
- 第九題 回文數
- 第十三題 羅馬數字轉整數
- 常見一些需求
- 把原始 list 轉換成樹形結構