楼主:
wheels 2021-07-23 17:28:13嗨,大家周末愉快!
不知道还记不记得之前小弟有分享面试 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!
作者:
Csir (张胖胖)
2021-07-23 17:44:00神QQ
作者: mathbookh2o2 2021-07-23 17:54:00
感觉实用
作者:
Lyumin (玉米)
2021-07-23 17:58:00推爆
作者:
jamfly (jamfly)
2021-07-23 18:11:00大推
作者: longint (数整的长长) 2021-07-23 18:18:00
推
作者:
kyrie77 (NTU KI)
2021-07-23 18:23:00推
作者: cossetannie (paa) 2021-07-23 18:29:00
推
作者: sph113 (sph) 2021-07-23 18:51:00
推
作者: k798976869 (kk) 2021-07-23 18:57:00
推
作者:
eggy1018 (羅密æ與豬éŽå¤œ)
2021-07-23 19:10:00真的是有刷的很深的才知道的python3小技巧! 推一本effective python 90 method
作者:
CKNTUErnie (德田田馥甄)
2021-07-23 19:13:00推
作者: oopssugar (ratio) 2021-07-23 19:33:00
推推
作者:
TAMSHUI (讓我醉æ»åœ¨å¤¢è£¡~)
2021-07-23 19:36:00推!
作者: ZuiYang (Zui) 2021-07-23 19:41:00
推
作者:
HMW (捷安特)
2021-07-23 19:56:00push
作者:
alpe (薛丁格的猫)
2021-07-23 19:59:00大推
作者: phys (jl) 2021-07-23 20:00:00
推
作者:
unmolk (UJ)
2021-07-23 20:14:00推….
作者:
ttsung2 (宗宗)
2021-07-23 20:20:00推
作者: underwater (underwater) 2021-07-23 20:30:00
虽然不是用python,还是大推
作者: onthesea (i am telegrammed) 2021-07-23 20:45:00
太神了
作者:
knme (knem)
2021-07-23 20:48:00推
作者:
bowin (尽其在我)
2021-07-23 20:49:00推分享
作者: lingege32 (MUDA) 2021-07-23 20:57:00
推大神
作者:
llltt123 (aka yoko)
2021-07-23 20:59:00推 感谢大神
作者: leewei05 (抠抠) 2021-07-23 21:02:00
推
作者:
tnfshjcc (↖煞气a携阿携↘)
2021-07-23 21:14:00推推 实用Python技巧
作者: caeserhaha (凯萨沙拉) 2021-07-23 21:49:00
推爆
作者:
tw11509 (John-117)
2021-07-23 22:02:00推,太神啦
作者: aassdd926 (打东东) 2021-07-23 22:10:00
看完觉得我不会写Python…
作者:
Luke3723 (Banana)
2021-07-23 23:39:00太神了 推!!
作者: yesgowow (荷包蛋) 2021-07-23 23:47:00
推 谢谢分享
作者:
tommytyc (75303301)
2021-07-24 00:16:00推
作者:
birdman (阿丸)
2021-07-24 01:03:00推分享
作者:
juju123 (华尔骑莉亚)
2021-07-24 01:32:00推推
作者:
f8210440 (Bl_20111022)
2021-07-24 01:57:00感谢 分享
作者: charle0911 2021-07-24 02:01:00
娘子出来看善心的耶稣
作者:
s1020824 (HowardW)
2021-07-24 02:26:00推
作者: la197352 2021-07-24 03:02:00
谢谢分享
有些技巧让可读性降低了 宁愿不用Code写得快没错 但好读重要很多吧
作者: dog661121 (完美不完美) 2021-07-24 03:31:00
推爆
作者:
jack529 (Jack)
2021-07-24 03:51:00赞
作者: arunaway (哎哟) 2021-07-24 04:36:00
谢谢分享
下面的小技巧要慎用, 主要是你需要解释给面试官听不是写得快就好leetcode的题目其实讨论区都有很好的答案想不出来的时候其实不妨看看讨论区最后就是要融会贯通, 如果自己当过面试官就知道其实很容易可以看出来面试者是真的懂还是背答案
作者: papaya0807 (papaya) 2021-07-24 08:55:00
推好神
作者: kiillen (神龙) 2021-07-24 09:27:00
太佛拉
作者:
j6004j6 (顺仔)
2021-07-24 09:34:00推起来~ 太佛了
作者:
mike8469 (mike8469)
2021-07-24 09:35:00推
作者:
Rayishere (Rayishere)
2021-07-24 11:05:00大推~~~ 感谢大大的无私分享
作者:
elseif 2021-07-24 12:12:00感谢分享! 来拜读!
作者:
loveu8 (RA1-推广)
2021-07-24 12:25:00推分享~
作者:
sarsman (DeNT15T♠)
2021-07-24 12:55:00推
作者:
windmax1 (I do my best)
2021-07-24 13:52:00天啊 大神太伟大了
作者:
tinwen (卡加ㄅㄨ列岛)
2021-07-24 15:10:00推~
作者:
ID3238 (默默)
2021-07-24 15:14:00谢谢分享 这对求职面试帮助很大
作者:
hortune (enutroh)
2021-07-24 15:33:00推!
作者: snowm (snow) 2021-07-24 15:55:00
谢谢分享!
作者: blackdiz 2021-07-24 17:18:00
感谢分享,好人一生平安
作者:
cuh0309 (yo玮)
2021-07-24 17:41:00推
作者:
vvind (wind)
2021-07-24 18:57:00太棒了
作者:
freedls (é˜¿å¬¤è¦ºå¾—ä½ å†·)
2021-07-24 19:11:00这个必推
作者: jasonwung (路人JJ) 2021-07-24 19:45:00
推推
作者: tigerya (虎Ya) 2021-07-24 21:25:00
推!
作者:
nofeel0 (\Bjergsen最高/)
2021-07-24 22:30:00推,感恩大大
作者: cotbel 2021-07-24 22:59:00
是notion,整理得好干净! 推推
作者:
DLHZ ( )
2021-07-24 23:13:00推
作者: hongwl030 (迷途小黑羊) 2021-07-24 23:24:00
推 有实力又好心
作者: kevinfilter (justinyeh1995) 2021-07-24 23:47:00
大推 感谢分享
作者:
shieldsky (Gray wolf)
2021-07-25 00:14:00真的好厉害!感谢分享!技巧很实用!
作者: ob9618 (ob9618) 2021-07-25 00:23:00
推
作者:
f821027 (蛋饼)
2021-07-25 01:01:00推
作者: KindWei (一切都是梦) 2021-07-25 01:14:00
推 python技巧
作者:
amiwry (肥墩墩大人)
2021-07-25 03:20:00感谢分享
作者:
bcjohn (bc)
2021-07-25 08:46:00推
作者: somoo (MMM) 2021-07-25 09:50:00
推神人 感谢无私分享
作者: blueVC (Uncle Carter) 2021-07-25 11:07:00
感谢分享!
作者:
darkch (chang)
2021-07-25 11:14:00这一定要推
作者:
lofu (lofu)
2021-07-25 14:51:00推
作者:
rotalume (rotalume)
2021-07-25 17:12:00推!
作者:
JocMon (晴朗夜晚)
2021-07-25 18:48:00推!
9的话分享个小东西 在整理资料的时候常常用到的主要是好几种摊平的方法 其实速度上会有差异之前因为有需求有写过一些比较reduce跟map印象中到了一定的scale后速度颇慢 所以直接弃用 numpy的话如果能指定型别 速度会快上更多不过如果都是python的list的话 就要看了 通常会慢都是混用的锅像是有时候知道pure python跑比较快的写法 但拿回来的是巢状numpy array 光转成list成本就很大了py真坑XD
作者:
Ekmund (是一只小叔)
2021-07-25 20:36:00用心分享给推
作者:
xoy232 (鬼岛希特勒)
2021-07-25 21:44:00推大神
作者: elvis17 2021-07-25 22:41:00
推 感谢大神分享~
作者:
Ouranos (å—¨)
2021-07-25 22:49:00大推,谢谢分享!
作者: smily134 (father134) 2021-07-25 23:01:00
推
作者: koichip (黑桃) 2021-07-26 00:06:00
推,谢谢大神分享
作者:
hongyan (Yan)
2021-07-26 00:09:00推 谢谢大什!!!神
作者: dannymc 2021-07-26 00:28:00
推推,感谢分享
作者: whatabiggun (奶奶早安) 2021-07-26 00:31:00
感谢
作者: ufap 2021-07-26 04:03:00
谢谢
作者: stone0811 (Stone) 2021-07-26 07:47:00
先推
作者:
BlazarArc (Midnight Sun)
2021-07-26 12:22:00推推
作者:
aacs0130 (æ¹›éˆ)
2021-07-26 13:52:00推推,实用,不过某些特殊的语法要确定自己了解再用
作者: TRESS 2021-07-26 22:59:00
推
作者:
WWIII (东邪西毒)
2021-07-28 16:02:00感动啊 软件人都是无私奉献
作者: justboa 2021-07-30 12:22:00
谢谢分享!
作者: tinnnnnngg (jjking) 2021-08-03 02:57:00
推实用
作者: YNNEKUW (YNNEKUW) 2021-08-03 19:10:00
大推
作者:
salamii (saaa)
2021-08-03 23:06:00推
作者:
markbex (马克杯)
2021-08-04 22:43:00推!感谢分享
作者:
hiarpu (up)
2021-08-07 18:18:00推
作者:
FourZero (亲爱的路人)
2021-08-15 00:07:00有神快拜