PTT推薦

[心得] Leetcode 刷題解答與 Python 3 小技巧分享

看板Soft_Job標題[心得] Leetcode 刷題解答與 Python 3 小技巧分享作者
wheels
()
時間推噓推:178 噓:0 →:27

嗨,大家週末愉快!


不知道還記不記得之前小弟有分享面試 Google TW SWE 的心得,

最後有提到小弟當初有發願,如果順利進去要把過去寫過題目留存的解答整理分享出來,

最近終於施工完了,提供給有需要的人可以自由取用。


這份解答內涵蓋了 781 題的 Python 3 解法(太早期刷的題目就沒留解法了 QQ),

寫這些解答的目的是為了還願並且回饋給還在努力的板友,

唯一的使用限制就是請不要拿來作商業用途,讓知識無償分享出去,感謝大家。

https://www.notion.so/lenchen/LeetCode-47d625b874894484af7c055b024b9817



內容主要分成四大類,


1. 資料結構

主題涵蓋常用於 Leetcode 內解題的資料結構,

較常見的:Array/String, Matrix, Linked List, HashSet/Map, Stack, Queue, Heap

較高階的:DSU, Trie, BIT

還有偶爾會用到 Deque 跟 sortedcontainers,但數量比較少就沒特別分類。


2. 演算法

這邊其實是我自己的歸類,不一定只有這些 XD

內容涵蓋有:

greedy, multiple pointers, sliding window, sort, DFS/BFS, backtracking,

sweep line, rolling sum, binary search, dynamic programming, minimax


有趣的是這邊沒列 divide and conquer 這個經典分類,

因為好像幾乎沒遇到過哪題是只能使用 divide and conquer 解的,

所以就沒有讓它自成一個分類了。

但若有題目也可以用 divide and conquer 解的話,

我也有寫下來,所以還是可以再自行了解下。


3. 圖

圖相關的問題因為太經典所以自成一個主題,

整理了我所遇到的常見圖論演算法,還有 topological sort 的兩種方式,

最重要的是 tree 相關的分類也包含在這一部分內。


4. 其他

數學、隨機、位元操作相關的題目都會在這裡。


大致上就分這四個部分,每個解答底下都有一行字總結這題的解題概念,

因為跨越了兩年半所以 coding style 可能也有些不一樣,

但保證其中 99% 的內容都是我親手一個個字元打出來的,

希望能幫助到有需要的人 :)



另外順便再分享一些我覺得使用 Python 3 刷題時可以用的一些小技巧,

可以讓你的 code 變得更精簡,大家可以看看然後挑自己喜歡的來使用:


1. 用 next 搭配 generator comprehension 來獲取第一個滿足條件的元素,

像是 next(ele for ele in arr if ele > 0),就可以拿到 arr 中的第一個正數。


2. 解對稱性題目時,可以把引數調換 call 一次,減少重複的 code,像是:

def foo(a, b):
if a > b: return foo(b, a)
...

就可以讓你接下來維持在 a <= b 的前提下繼續寫 code,或者直接 swap 引數也可以:

def foo(a, b):
if a > b: a, b = b, a
...


3. python dict 可以使用 tuple 作 multikey,像是 d[k1, k2, k3],

如此一來就不用巢狀 dict 了(d[k1][k2][k3])


4. 可以使用 unpacking 來抽取出需要的參數,像是:

A = [1, 2, 3, 4, 5]

foo, *B, bar = A

可以得到 foo == 1, B == [2, 3, 4], bar == 5

另外還可以用巢狀 unpacking,

像是 for i, (a, b) in enumerate(pairs): 就超級常用。


5. Python 3.8 跟 3.9 有多了一些不錯的東西,

像是 3.8 的 assignment expression(:=) 跟 3.9 的 dict shallow merge(|)

都有機會可以讓 code 更精簡。


6. 有些 matrix 或是 grid 的題目,兩個 dimension 長度有可能為 0,

可以用 if not any(matrix): return xxx 來處理(感謝 Stefan Pochmann)


7. in 也會消費 iterator,

所以如果想知道某個 str s2 是不是另一個 str s1 的 subsequence 可以這麼做,

I = iter(s1)
return all(c in I for c in s2)

(再次感謝 Stefan Pochmann)


8. 想要測兩個數是不是同正負可以用 (a > 0) is (b > 0),記得事先檢查 0

板友提供 (credit to @pig2014): a ^ b > 0 更好


9. 想要攤平巢狀 list 可以用 sum(L, []) <- 不建議!途中 list 會一直重新 alloc

(credit to @coquelicot)

參考 stack overflow:https://bit.ly/3rz8UqH

建議的替代:

9.1. list comprehension: A = [ele for sub in arr for ele in sub]

9.2. itertools: A = list(itertools.chain.from_iterable(arr))

9.3. reduce: A = functools.reduce(operator.iconcat, arr, [])


10. 某些要提供 factory function 的地方,可以遞迴給自己,像是:

trie = lambda: collections.defaultdict(trie)


11. itemgetter 在某些需要 key 的 builtin function 很好用,像是:

sorted(A, key=itemgetter(1)),等同於寫 key=lambda x: x[1]


12. 因為 Python list 提供 negative indexing,

在某些情況可以用 ~i 來獲得對應於 i 的反向 indexing,像是:

for i in range(len(A)):
A[i] += xxx # A[0], A[1], A[2] , ...
A[~i] += ooo # A[-1], A[-2], A[-3], ...


大概就是這些東西了吧,這些技巧有些人喜歡有些人不喜歡,

我覺得沒有對錯啦,就挑自己覺得不錯的用吧 XD

happy coding!

--

※ PTT留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.161.76.160 (臺灣)
PTT 網址

yupog200307/23 17:37還沒看內容,先大推,感謝

EngineerChen07/23 17:38推神人

Csir07/23 17:44神QQ

kiki8615107/23 17:51推 python很多技巧真的很好用

mathbookh2o207/23 17:54感覺實用

Lyumin07/23 17:58推爆

hanamini07/23 18:07

jamfly07/23 18:11大推

KingSteven07/23 18:14

longint07/23 18:18

kyrie7707/23 18:23

MoonCode07/23 18:26

cossetannie07/23 18:29

sph11307/23 18:51

parsons1234207/23 18:53推好心

k79897686907/23 18:57

chatnoir07/23 18:57大推

UnReal556607/23 19:07有神

eggy101807/23 19:10真的是有刷的很深的才知道的python3小技巧! 推一本effe

eggy101807/23 19:10ctive python 90 method

CKNTUErnie07/23 19:13

Findagreen07/23 19:25太佛了 在這邊祝福原po上廁所都有衛生紙

luweber8807/23 19:27

oopssugar07/23 19:33推推

duck1070407/23 19:35推 神人

TAMSHUI07/23 19:36推!

ZuiYang07/23 19:41

HMW07/23 19:56push

gaowei1607/23 19:57

Kagami342107/23 19:58

alpe07/23 19:59大推

phys07/23 20:00

WaterLengend07/23 20:01只能推了

rumrumrum07/23 20:03推推

kangan98707/23 20:14太強了!推

unmolk07/23 20:14推….

ttsung207/23 20:20

underwater07/23 20:30雖然不是用python,還是大推

littleshin07/23 20:34

onthesea07/23 20:45太神了

knme07/23 20:48

bowin07/23 20:49推分享

itis042307/23 20:53

lingege3207/23 20:57推大神

jinmin8807/23 20:58太猛啦

llltt12307/23 20:59推 感謝大神

OSDBNetwork07/23 21:02推 大神

leewei0507/23 21:02

ericx79010107/23 21:12推!感謝無私分享!

tnfshjcc07/23 21:14推推 實用Python技巧

EntHeEnd07/23 21:41讚喔

caeserhaha07/23 21:49推爆

nicehorse0607/23 21:56大神推

tw1150907/23 22:02推,太神啦

aassdd92607/23 22:10看完覺得我不會寫Python…

DCTmaybe07/23 22:17也太神了吧

devilkool07/23 22:53厲害

bjocke83101007/23 23:34感謝大神~

Luke372307/23 23:39太神了 推!!

yesgowow07/23 23:47推 謝謝分享

tommytyc07/24 00:16

birdman07/24 01:03推分享

ss8651twtw07/24 01:29學到了好多技巧 推推

juju12307/24 01:32推推

yoshonabee07/24 01:35

cacadeon07/24 01:37感謝詳細分享

f821044007/24 01:57感謝 分享

charle091107/24 02:01娘子出來看善心的耶穌

vincent096507/24 02:02

s102082407/24 02:26

cococing07/24 02:59推推

la19735207/24 03:02謝謝分享

mirror022707/24 03:17有些技巧讓可讀性降低了 寧願不用

mirror022707/24 03:17Code寫得快沒錯 但好讀重要很多吧

同意,所以我文中有說有些人喜歡有些人不喜歡,選自己喜歡的用就好, 像是我個人比較偏好用 dict.setdefault 建 trie 而不是用 defauldict, 但這些技巧的背後都代表著一些語言特性,了解一下並不吃虧。 而且說句實在話,限制短時間的面試 跟 長期維護的產品,出發點並不能一概而論。

dog66112107/24 03:31推爆

jack52907/24 03:51

arunaway07/24 04:36謝謝分享

hydradevil07/24 06:24推佛心

davidpanda07/24 07:12下面的小技巧要慎用, 主要是你需要解釋給面試官聽

davidpanda07/24 07:12不是寫得快就好

davidpanda07/24 07:13leetcode的題目其實討論區都有很好的答案

davidpanda07/24 07:13想不出來的時候其實不妨看看討論區

davidpanda07/24 07:14最後就是要融會貫通, 如果自己當過面試官就知道

davidpanda07/24 07:15其實很容易可以看出來面試者是真的懂還是背答案

沒錯,絕對不要背答案,一個變化就倒了,該學習的是每題背後用到的觀念。 然後這份的解法就是揉合了討論區跟解答寫出來的 XD 因為發現有時候 leetcode 解答反而不是最佳解, 像是 Morris traversal 就只有少數幾篇解答有提到,但超多題目其實都可以用。

papaya080707/24 08:55推好神

kiillen07/24 09:27太佛拉

j6004j607/24 09:34推起來~ 太佛了

mike846907/24 09:35

jimjim95135707/24 09:36

HelloPTT07/24 10:03

julian992507/24 11:05好佛,謝謝大大分享

Rayishere07/24 11:05大推~~~ 感謝大大的無私分享

swinds2407/24 11:50推分享!

elseif07/24 12:12感謝分享! 來拜讀!

FireKingStar07/24 12:18謝謝大大的分享,我會仔細的研讀它。

loveu807/24 12:25推分享~

angellee010207/24 12:41感謝分享!

sarsman07/24 12:55

windmax107/24 13:52天啊 大神太偉大了

tinwen07/24 15:10推~

ID323807/24 15:14謝謝分享 這對求職面試幫助很大

stu5121107/24 15:19謝謝!

Raymond071007/24 15:26感謝無私分享

hortune07/24 15:33推!

nba88721507/24 15:40

AgileSeptor07/24 15:54

snowm07/24 15:55謝謝分享!

euleramon07/24 16:37想請問一下大大是不是有做過 AI相關的領域?

沒有耶,在學期間是有修過幾門 AI/ML 相關的課程, 出社會後主要是在做 web/app 的開發。

deforest11107/24 16:47推強者

Gaogaigar07/24 17:02推佛心 可惜我躺平了才看到

blackdiz07/24 17:18感謝分享,好人一生平安

cuh030907/24 17:41

andy959599507/24 18:13

vvind07/24 18:57太棒了

freedls07/24 19:11這個必推

sky8042007/24 19:40推推

jasonwung07/24 19:45推推

playboy007gy07/24 19:56好人一生平安

tigerya07/24 21:25推!

qq9966pp07/24 22:15必須推

nofeel007/24 22:30推,感恩大大

cotbel07/24 22:59是notion,整理得好乾淨! 推推

DLHZ07/24 23:13

hongwl03007/24 23:24推 有實力又好心

kevinfilter07/24 23:47大推 感謝分享

a2462629607/24 23:50感恩,讚歎

shieldsky07/25 00:14真的好厲害!感謝分享!技巧很實用!

ob961807/25 00:23

f82102707/25 01:01

KindWei07/25 01:14推 python技巧

amiwry07/25 03:20感謝分享

PonyTail090107/25 04:05太強大了 希望我也能早日上岸

※ 編輯: wheels (118.161.76.160 臺灣), 07/25/2021 04:15:03

bcjohn07/25 08:46

apple2013207/25 09:37推 感謝

summerleaves07/25 09:38推推

somoo07/25 09:50推神人 感謝無私分享

cypress504807/25 10:56大推!!

blueVC07/25 11:07感謝分享!

darkch07/25 11:14這一定要推

kuochuwon07/25 11:51收藏一下,推

lofu07/25 14:51

gn0233533807/25 15:52

followmeyo07/25 16:48高手

rotalume07/25 17:12推!

ukuk66688807/25 17:43

JocMon07/25 18:48推!

world4jason07/25 19:499的話分享個小東西 在整理資料的時候常常用到的

world4jason07/25 19:49主要是好幾種攤平的方法 其實速度上會有差異

world4jason07/25 19:49之前因為有需求有寫過一些比較

world4jason07/25 19:49reduce跟map印象中到了一定的scale後速度頗慢 所以直

world4jason07/25 19:49接棄用 numpy的話如果能指定型別 速度會快上更多

world4jason07/25 20:00不過如果都是python的list的話 就要看了 通常會慢都

world4jason07/25 20:00是混用的鍋

world4jason07/25 20:05像是有時候知道pure python跑比較快的寫法 但拿回來

world4jason07/25 20:05的是巢狀numpy array 光轉成list成本就很大了

world4jason07/25 20:05py真坑XD

answermangtr07/25 20:26超級巧 剛剛看完您的面試心得就發現您發新文章

Ekmund07/25 20:36用心分享給推

snow1072507/25 20:41圍觀感謝

xoy23207/25 21:44推大神

elvis1707/25 22:41推 感謝大神分享~

Ouranos07/25 22:49大推,謝謝分享!

smily13407/25 23:01

tsubasaxxx07/25 23:19收藏推 謝謝

koichip07/26 00:06推,謝謝大神分享

hongyan07/26 00:09推 謝謝大什!!!

hongyan07/26 00:13

dannymc07/26 00:28推推,感謝分享

whatabiggun07/26 00:31感謝

airforceso07/26 02:54感恩推推推

ufap07/26 04:03謝謝

stone081107/26 07:47先推

whitecolor07/26 09:27

BlazarArc07/26 12:22推推

aacs013007/26 13:52推推,實用,不過某些特殊的語法要確定自己了解再用

maoqq040507/26 15:06推推

sandy464507/26 16:09推 太佛 謝謝分享

TRESS07/26 22:59

howard5000907/26 23:40

howard5000907/26 23:40

howard5000907/26 23:40

howard5000907/26 23:41

timuwtpirt07/28 00:18

WWIII07/28 16:02感動啊 軟體人都是無私奉獻

holmes213607/28 19:01推分享

sars7878607/29 23:39

NealPope07/30 00:40推爆啦!

justboa07/30 12:22謝謝分享!

hsiaotzu050508/01 11:14推!謝謝!

tinnnnnngg08/03 02:57推實用

gvles121008/03 16:13

YNNEKUW08/03 19:10大推

salamii08/03 23:06

markbex08/04 22:43推!感謝分享

UlyssesLee08/05 23:08好久沒來這版 一來就看到神 推推

hiarpu08/07 18:18

FourZero08/15 00:07有神快拜

pupurita08/27 14:50謝謝神人

ywbBetter09/16 12:58Good

gogohata12/02 19:01

Meton01/03 20:39雖然不是寫python 但還是推!造福版友!

RonChen01/29 11:52感謝分享,這絕對得推

zzzz893106/08 14:03

MKIU09/03 21:45https://imgur.com/6fNIOWL

a2462629609/08 21:23應該跪才對