刷Leetcode演算法的第一天

2021-10-21 18:13:53 字數 4757 閱讀 8699

今天是刷lt的一天,好好乾飯,好好努力,好好加油哦!

第一題

題目描述:

找到幾個字串中最長公共字首。

例子如下:

input:

["flower"

,"flow"

,"flight"

]output:

"fl"

input:

["dog"

,"racecar"

,"car"

]output:

""

方法一

解析思路:

這裡需要使用的的是zip函式和set函式,先理解這兩個函式的用法再做這道題。

(1) zip() vs zip(*)

zip()函式作用於可迭代的物件,將物件對應的元素組成乙個個元組

然後返回這些元組的列表, 例子如下:

a =[1

,2,3

]b =

["a"

,"b"

,"c"

]list

(zip

(a, b)

)#用list列出來

輸出為:[(1

,'a'),

(2,'b'),

(3,'c'

)]

zip(*)函式則相反,起到解壓的作用,

例子如下:

example =

["flower"

,"flow"

,"flqwe"

]list

(zip

(*example)

)輸出為:[

('f'

,'f'

,'f'),

('l'

,'l'

,'l'),

('o'

,'o'

,'q'),

('w'

,'w'

,'w'

)]

(2)set()函式

set() 函式建立乙個無序不重複元素集,可用於刪除重複值。例子如下

a =

set(

'abcdd'

)b =

set(

'cdeff')a

b輸出為:

a & b #交集 

輸出為

a | b #並集

輸出為

回到之前的題目,需要返回列表中的幾個字元中共同字首。

input:

["flower"

,"flow"

,"flight"

]output:

"fl"

首先,用zip(*)把列表的幾個字元解壓出來,把input解壓出來,變成[(『f』, 『f』, 『f』), (『l』, 『l』, 『l』), (『o』, 『o』, 『q』), (『w』, 『w』, 『w』)], 然後用set函式去掉重複值,變成[(『f』), (『l』), ( 『o』, 『q』), (『w』)],最後用乙個if函式,只取其中set後長度為1的字元。python如下:

def

longestcommonprefix

(strs)

->

str:

opt =

''for i in

zip(

*strs)

:#zip (*strs) 即是解壓組合出來

iflen

(set

(i))==1

:#針對set後長度為1的字元

opt += i[0]

#錄入字元

else

:break

return opt

方法二:

把列表的第乙個字串作為標準,跟剩餘的其他字串比較。而兩個字串的比較使用二分法來比較,最後的時間複雜度為o(n*log(n))。跟第乙個方法的時間複雜度相比好很多。

使用乙個例子來理解兩個字串的二分法是:

str =

首先,leets 從中間拆開,5//2 = 2 即leets 分為 lee 和 ts

然後,檢查lee 是否in一致通過

再然後,把t加入lee 為leet,再次檢查leet 是否in並沒有一致通過

所以直接返回 lee為最長公共字首。用這個方法執行起來更快。

首先理解find函式用法,可以檢測字串中是否包含子字串

find()函式語法 :string.find(str, beg=0, end=len(string))

str : 指定檢索的字串

beg :開始索引,預設為0

end :結束索引,預設為字串的長度

如果指定 beg(開始) 和 end(結束) 範圍,則檢查是否包含在指定範圍內

如果包含子字串返回開始的索引值,否則返回-1

例子:

str1 =

str2 =

"and"

print

(str1.find(str2)

)#沒有任何指定範圍,預設整個字串範圍

print

(str1.find(str2,1)

)#指定從位置為1的開始檢索

print

(str1.find(str2,10)

)#指定從位置為10的開始檢索輸出5

5-1

所以定義passornot函式 檢測字元是否全部通過

def

passornot

(strs,mid)

: s = strs[0]

[0:mid]

#檢測剩餘的其他字串

for i in

range(1

,len

(strs)):

#如果出現了不通過的情況,則馬上return false

if strs[i]

.find(s)!=0

:return

false

#如果都通過,即剩餘的字串都包含s,則return true

return

true

現在可以定義整個函式

def

longestcommonprefix

(strs)

:'''

:strs: list type 包含多個字串的列表

返回最長的公共字首

'''#取列表中的第乙個字串作為標準比較

low, high =1,

len(strs[0]

)while low <= high:

mid =

(low + high)//2

if passornot(strs,mid)

: low = mid +

1else

: high = mid -

1return strs[0]

[0:(low+high)//2

]

題目二

題目描述:

給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 (從0開始)。如果不存在,則返回 -1。

例子如下:

輸入: haystack =

"hello"

, needle =

"ll"

輸出:2

輸入: haystack =

"aaaaa"

, needle =

"bba"

輸出:-

1

解析思路:

直接根據條件來,用多個if 來篩選。

def

strstr

(haystack,needle)

: lh =

len(haystack)

#haystack的長度

ln =

len(needle)

#needle的長度

if ln ==0:

#當needle為空集return0

return

0if lh ==

0or lh < ln:

#當不符合條件無法查詢 return -1

return-1

i =0while

(i<=lh-ln)

:if haystack[i]

== needle[0]

:#當出現和needle第乙個字母相同的字元時,測試後面的是否一致。

if haystack[i:i+ln]

== needle:

#記住[i:i+ln]字元提取是取前不取後,即i+ln的字元是沒有取到的。

return i

else

: i+=

1else

: i+=

1return

-1

刷leetcode的第一天

1 類和例項 類是抽象的模板 例是根據類建立出來的乙個個具體的 物件 例 class student object bart student bart main.student object at 0x10a67a590 0x10a67a590是個記憶體位址 student bart是個變數 stu...

leetcode刷題第一天

給你兩個 非空 的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。class solution def addtwonumbers se...

leetcode刷題筆記 第一天

題目說明 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。解題思路 首先判斷needle是否在haystack中,如果存在則返還needle所在位置。如果不存在,則返還 1。def s...