LeetCode習題總結 演算法(5)

2021-10-06 06:04:43 字數 2082 閱讀 4212

首先先上原題:

通過給定對應七種羅馬數字對應的七種字元: i, v, x, l,c,d 和 m;以及對應七種字元所對應的數值:i:1,v:5,x:10,l:50,c:100,d:500,m:1000。去求解在給定乙個羅馬字串時,對應的羅馬數字表示為多少。

思路:基於此題目,我們可以發現對應的羅馬字元和羅馬數字之間是存在對應的一種關係——key—value(鍵值對關係),即乙個羅馬字元對應乙個確定性的數值。所以在此我們可以採用字典結構來實現鍵值數值之間的一一對應的關係。

廢話不多說,直接上**。

class

solution

:def

romantoint

(self, s:

str)

->

int:

dict_roman =

result =

0# 此處遍歷的範圍是0-n-1之間

for i in

range

(len

(s)-1)

:# 針對幾種特殊的情況(小字元在大字元前):

# 1、i 在 v (5) 和 x (10) 的左邊,來表示 4 和 9

# 2、x 在 l (50) 和 c (100) 的左邊,來表示 40 和 9。

# 3、c 在 d (500) 和 m (1000) 的左邊,來表示 400 和 900。

# 我們採取對對應的小字元數值的負值來實現對應的減法操作

if dict_roman[s[i]

]< dict_roman[s[i+1]

]:result -= dict_roman[s[i]

]elif dict_roman[s[i]

]>= dict_roman[s[i+1]

]:result += dict_roman[s[i]

]else

:print

("輸入錯誤,請重新輸入。"

)break

# 由於題目給定範圍是1-3999,所以此處加入條件判斷語句判斷結果是否合法

return result + dict_roman[s[-1

]]if1

<=result + dict_roman[s[-1

]]<=

3999

else

false

此處執行的時間複雜度為o(n),因為僅涉及乙個遍歷整個字典的操作,對應於hash檢索

第一種方法的執行時間和記憶體消耗

關於列舉型別資料的參考:

class

solution

:def

romantoint

(self, s:

str)

->

int:

dict_roman =

# 通過利用列舉型別的資料來建立起對應字元和數字之間的關聯性,即enumerate(sequence , index)

return

sum(

- dict_roman[s[i]

]if i <

len(s)-1

and dict_roman[s[i]

]< dict_roman[s[i+1]

]else dict_roman[s[i]

]for i,n in

enumerate

(s))

第二種方法的執行時間和記憶體消耗

當以後遇到類似於此題型別的資料,即給定乙個x,存在有乙個y這樣的對應關係。這個時候我們便可以參考利用python中的字典來完成對資料的訪問操作,或者是參考python中的**enumerate(列舉)**結構來實現索引值與下標的一一對應關係。

LeetCode習題總結 演算法(10)

首先先上原題 拿到這道題,我們採取以下的思想來處理這個問題 1 是否特定的子串在正串中存在?2 如果不存在,我們應該返回什麼樣的數值?3 如果存在,我們該怎樣找尋子串在正串中第一次出現的位置?當我們拿到這道題時,如果能把以下幾道題能夠思考明白,想必這道題的難度係數也不會太大。那我們以此來思考上述的幾...

LeetCode習題總結 演算法(15)

首先先上原題 在剛看到這道題的時候,也許對於題目的意思能夠進行很好的理解。即本題想要實現的是給定一字串,尋找出最大的無重複子串。但是,我們在面對題目所給樣例如abcabcbb或是pwwekw這樣的包含重複子串的整串時,如果能夠將重複的子串進行適當的刪除操作。這便是本題中最為核心的部分。那麼如果我們需...

六一兒童節之LeetCode習題總結 演算法(14)

首先先上原題 背景闡述 輸入 candies 2,3,5,1,3 extracandies 3 輸出 true,true,true,false,true 解釋 孩子 1 有 2 個糖果,如果他得到所有額外的糖果 3個 那麼他總共有 5 個糖果,他將成為擁有最多糖果的孩子。孩子 2 有 3 個糖果,如...