今天是刷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...