About
之前我制定的學(xué)習(xí)計(jì)劃是每天一道LeetCode題抵屿,因?yàn)閭€(gè)人認(rèn)為前端不需要多好的算法功底粱玲,我只是想通過(guò)做題來(lái)保證自己的大腦是靈活的诸尽,但最近因?yàn)橐恍┦虑榈R了蠢箩,所以沒(méi)更新劳翰,今天開始接著更新敦锌。
羅馬數(shù)字轉(zhuǎn)整數(shù)
題目描述
羅馬數(shù)字包含以下七種字符: I, V佳簸, X乙墙, L颖变,C,D 和 M听想。
字符 數(shù)值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如腥刹, 羅馬數(shù)字 2 寫做 II ,即為兩個(gè)并列的 1汉买。12 寫做 XII 衔峰,即為 X + II 。 27 寫做 XXVII, 即為 XX + V + II 蛙粘。
通常情況下垫卤,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊。但也存在特例出牧,例如 4 不寫做 IIII穴肘,而是 IV。數(shù)字 1 在數(shù)字 5 的左邊舔痕,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 梢褐。同樣地,數(shù)字 9 表示為 IX赵讯。這個(gè)特殊的規(guī)則只適用于以下六種情況:
I 可以放在 V (5) 和 X (10) 的左邊盈咳,來(lái)表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左邊边翼,來(lái)表示 40 和 90鱼响。
C 可以放在 D (500) 和 M (1000) 的左邊,來(lái)表示 400 和 900组底。
給定一個(gè)羅馬數(shù)字丈积,將其轉(zhuǎn)換成整數(shù)。輸入確保在 1 到 3999 的范圍內(nèi)债鸡。
示例 1:
輸入: "III"
輸出: 3
示例 2:
輸入: "IV"
輸出: 4
示例 3:
輸入: "IX"
輸出: 9
示例 4:
輸入: "LVIII"
輸出: 58
解釋: L = 50, V= 5, III = 3.
示例 5:
輸入: "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/roman-to-integer
解題思路
- 先寫一個(gè)字典用來(lái)保存每一個(gè)羅馬字符對(duì)應(yīng)的數(shù)字
- 解讀題目可知一般情況下數(shù)值小的字符都在數(shù)值大的字符右側(cè)江滨,但是偶爾也會(huì)在左側(cè),當(dāng)然厌均,有也僅僅會(huì)有一位數(shù)值小的字符會(huì)出現(xiàn)在數(shù)值大的字符的左側(cè)
- 根據(jù)上面的規(guī)律唬滑,我們從頭遍歷字符串,如果前面的字符小于后面的字符棺弊,那么就用后面的字符減去前面的字符晶密,如果大于,則直接相加即可模她。
代碼如下
class Solution:
def romanToInt(self, s: str) -> int:
dict = {'I': 1, 'V': 5, 'X': 10, 'L':50, 'C':100, 'D': 500, 'M': 1000}
index = result = 0
while index < len(s) - 1:
if dict[s[index]] >= dict[s[index+1]]:
result += dict[s[index]]
index += 1
else:
result += dict[s[index+1]] - dict[s[index]]
index += 2
if index < len(s):
result += dict[s[index]]
return result
運(yùn)行結(jié)果
結(jié)束語(yǔ)
還有很多的數(shù)據(jù)結(jié)構(gòu)我不會(huì)稻艰,還有很多的算法我也不會(huì),前端要學(xué)習(xí)的東西還很多侈净,惆悵尊勿,一步一步慢慢來(lái)吧~