Skip to content

Commit d2d7b2f

Browse files
committed
2 parents 2c37a48 + 5a8c8a8 commit d2d7b2f

File tree

10 files changed

+82
-0
lines changed

10 files changed

+82
-0
lines changed

docs/04_队列/queue.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,11 @@ for i in range(100):
7979
- remove(node) # O(1)
8080

8181
啊哈,似乎删除頭尾都可以啦,而且都是 O(1) 的,完美。
82+
<<<<<<< HEAD
8283
交给你一個艰巨的任务,實現双端陣列 Deque() ADT。你可以参考前幾章的任何原始碼,挑戰一下這個任务,别忘记寫單元測試呦。當然如果没想出來也没關系,後面我們實現堆疊的時候還會用到它,那裡我們會實現這個原始碼。
84+
=======
85+
交给你一個艰巨的任务,實現双端陣列 Deque() ADT。你可以参考前幾章的任何原始碼,挑战一下這個任务,别忘记寫單元測試呦。當然如果没想出來也没關系,後面我們實現堆疊的時候還會用到它,那裡我們會實現這個原始碼。
86+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
8387
8488

8589
# 思考题

docs/07_哈希表/hashtable.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,11 @@ class HashTable(object):
168168
pass
169169
```
170170

171+
<<<<<<< HEAD
171172
具體的實現和原始碼撰寫在影片裡講解。這個原始碼可不太好實現,稍不留神就會有错,我們還是通過撰寫單元測試驗證原始碼的正確性。
173+
=======
174+
具體的實現和原始碼编寫在影片裡講解。這個原始碼可不太好實現,稍不留神就會有错,我們還是通過编寫單元測試驗證原始碼的正確性。
175+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
172176
173177
# 思考题
174178
- 請你分析下哈希表插入和删除元素的平均時間複雜度是多少?我們都實現原始碼了,相信這個問題你可以回答上來

docs/10_递归/recursion.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ def fact(n):
3434

3535
# 調用堆疊
3636
看了上一個例子你可能覺得遞迴好簡單,先别着急,我們再舉個簡單的例子,上邊我們並没有講遞迴如何工作的。
37+
<<<<<<< HEAD
3738
假如讓你輸出從 1 到 10 這十個數字,如果你是個正常人的話,我想你的第一反應都是這麼寫:
39+
=======
40+
假如讓你輸出從 1 到 10 這十個數字,如果你是個正常人的話,我想你的第一反应都是這麼寫:
41+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
3842
3943
```py
4044
def print_num(n):

docs/11_线性查找与二分查找/search.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ assert linear_search_recusive(number_list, 8) == -1
5151
assert linear_search_recusive(number_list, 7) == 7
5252
assert linear_search_recusive(number_list, 0) == 0
5353
```
54+
<<<<<<< HEAD
5455
這裡的 assert 我多寫了幾個,包括正常情况、異常情况和邊界值等,因為遞迴比较容易出错。注意這裡的兩個遞迴出口。
56+
=======
57+
這裡的 assert 我多寫了幾個,包括正常情况、异常情况和邊界值等,因為遞迴比较容易出错。注意這裡的兩個遞迴出口。
58+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
5559
當然業務原始碼裡如果碰到這種問題我們肯定是選上邊最直白的方式來實現,要不你的同事肯定想打你。
5660

5761
# 二分查找
@@ -98,13 +102,23 @@ def test_binary_search():
98102

99103

100104
# 思考题
105+
<<<<<<< HEAD
101106
- 给你個挑戰,用遞迴來實現本章的二分查找。你要十分注意邊界條件,注意用單測測試呦,在你寫原始碼的時候,可能會碰到邊界問題或者無穷遞迴等。 如果你想不起來,可以看看本章的原始碼示例
102107
- 二分查找有一個變形,比如我們想在一個有序數組中插入一個值之後,數組仍保持有序,請你找出這個位置。(bisect 模塊)
103108

104109

105110
# 延伸閱讀
106111
這裡没给鏈接,請善用 google 等搜索引擎和 Dash(mac) 等文件查询工具,在你學習原始碼的過程中你會非常頻繁地使用它們。
107112
或者如果你有時間也可以跳轉到這些模塊的源碼,看看它們的實現方式。標準庫都是些高手寫的,肯定能學到一些姿势。
113+
=======
114+
- 给你個挑战,用遞迴來實現本章的二分查找。你要十分注意邊界條件,注意用單測測試呦,在你寫原始碼的時候,可能會碰到邊界問題或者無穷遞迴等。 如果你想不起來,可以看看本章的原始碼示例
115+
- 二分查找有一個变形,比如我們想在一個有序數組中插入一個值之後,數組仍保持有序,請你找出這個位置。(bisect 模塊)
116+
117+
118+
# 延伸閱讀
119+
這裡没给鏈接,請善用 google 等搜索引擎和 Dash(mac) 等文档查询工具,在你學習原始碼的過程中你會非常頻繁地使用它們。
120+
或者如果你有時間也可以跳轉到這些模塊的源碼,看看它們的實現方式。標准库都是些高手寫的,肯定能學到一些姿势。
121+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
108122
109123
- 閱讀 python 文件關於二分的 bisect 模塊。
110124
- 閱讀 python 文件 itertools 相關模塊和常見的幾個函數 takewhile, dropwhile, from_iterable, count, tee 等用法

docs/13_高级排序算法/quick_sort.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,11 @@ T(n) = 2T(n/2) + n
102102
- 最坏的情况下快排的時間複雜度是多少?什麼時候會發生這種情况?
103103
- 我們實現的快排是稳定的啵?
104104
- 選择基准值如果選不好就可能导致複雜度升高,算导中提到了一種『median of 3』策略,就是說選择 pivot 的時候 從子數組中随機選三個元素,再取它的中位數,你能實現這個想法嗎?這裡我們的原始碼很簡單地取了第一個元素作為 pivot
105+
<<<<<<< HEAD
105106
- 利用快排中的 partition 操作,我們還能實現另一個算法,nth_element,快速查找一個無序數組中的第 n 大元素,請你嘗試實現它並撰寫單測。其實這個函數是 C++ STL 中的一個函數。
107+
=======
108+
- 利用快排中的 partition 操作,我們還能實現另一個算法,nth_element,快速查找一個無序數組中的第 n 大元素,請你嘗試實現它並编寫單測。其實這個函數是 C++ STL 中的一個函數。
109+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
106110
- 你知道 Python 内置的 sorted 如何實現的嗎?請你 Google 相關資料了解下。很多内置的排序都使用了快排的改良版。
107111

108112

docs/14_树与二叉树/tree.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@
3535
- 樹的宽度(width): 二叉樹的宽度指的是包含最多節點的层級的節點數
3636
- 樹的 size:二叉樹的節點总個數。
3737

38+
<<<<<<< HEAD
3839
一棵 size 為 n 的二叉樹高度最多可以是 n,最小的高度是 $ \lfloor lgn \rfloor + 1 $,這裡 log 以 2 為底簡寫為
40+
=======
41+
一棵 size 為 n 的二叉树高度最多可以是 n,最小的高度是 $ \lfloor lgn \rfloor + 1 $,這裡 log 以 2 為底簡寫為
42+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
3943
lgn,和算法導論保持一致。這個結果你只需要用高中的累加公式就可以得到。
4044

4145
# 一些特殊的二叉樹
@@ -77,7 +81,11 @@ class BinTree(object):
7781
self.root = root
7882
```
7983

84+
<<<<<<< HEAD
8085
怎麼构造上图中的二叉樹呢,似乎其他課本没找到啥例子(有些例子是寫了一堆嵌套節點來定義,很难搞清楚层次關系),我自己定義了一種方法,首先我們輸入節點信息,仔細看下邊原始碼,叶子節點的 left 和 right 都是 None,並且只有一個根節點 A:
86+
=======
87+
怎麼构造上图中的二叉树呢,似乎其他課本没找到啥例子(有些例子是寫了一堆嵌套節點來定義,很难搞清楚层次關系),我自己定義了一種方法,首先我們輸入節點信息,仔细看下邊原始碼,叶子節點的 left 和 right 都是 None,並且只有一個根節點 A:
88+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
8189
8290
```py
8391
node_list = [
@@ -247,8 +255,13 @@ class Queue(object): # 借助内置的 deque 我們可以迅速實現一個 Que
247255
```
248256

249257

258+
<<<<<<< HEAD
250259
# 反轉二叉樹
251260
之所以單拎出來說這個是因為 mac 下著名的 brew 工具作者据說是因為面試 google 白板编程没寫出來反轉二叉樹跪了。然後人家就去了苹果 😂。其實吧和遍历操作相比也没啥太大區别,遞迴交換就是了:
261+
=======
262+
# 反轉二叉树
263+
之所以單拎出來說這個是因為 mac 下著名的 brew 工具作者据說是因為面試 google 白板编程没寫出來反轉二叉树跪了。然後人家就去了苹果 😂。其實吧和遍历操作相比也没啥太大區别,遞迴交換就是了:
264+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
252265
253266
```py
254267
def reverse(self, subtree):

docs/15_堆与堆排序/heap_and_heapsort.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ right = 2 * i + 2
3838
超出下標表示没有對應的孩子節點。
3939

4040
# 實現一個最大堆
41+
<<<<<<< HEAD
4142
我們將在影片裡詳細描述和撰寫各個操作
43+
=======
44+
我們將在影片裡详细描述和编寫各個操作
45+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
4246
4347
```py
4448
class MaxHeap(object):
@@ -122,7 +126,11 @@ def test_heapsort_reverse():
122126
```
123127

124128
# Python 裡的 heapq 模塊
129+
<<<<<<< HEAD
125130
python 其實自带了 heapq 模塊,用來實現堆的相關操作,原理是類似的。請你閱讀相關文件並使用内置的 heapq 模塊完成堆排序。
131+
=======
132+
python 其實自带了 heapq 模塊,用來實現堆的相關操作,原理是類似的。請你閱讀相關文档並使用内置的 heapq 模塊完成堆排序。
133+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
126134
一般我們刷题或者寫業務原始碼的時候,使用這個内置的 heapq 模塊就够用了,内置的實現了是最小堆。
127135

128136

docs/16_优先级队列/priority_queue.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@
33
但其實是使用堆來實現的。上一章講完了堆,這一章我們就趁熱打鐵來實現一個優先級陣列。
44

55

6+
<<<<<<< HEAD
67
# 實現優先級陣列
78
優先級陣列(Priority Queue) 顧名思義,就是入隊的時候可以给一個優先級,通常是個數字或者時間戳等,
89
當出隊的時候我們希望按照给定的優先級出隊,我們按照 TDD(測試驅動開發) 的方式先來寫測試原始碼:
10+
=======
11+
# 實現優先级陣列
12+
優先级陣列(Priority Queue) 顧名思義,就是入隊的時候可以给一個優先级,通常是個數字或者時間戳等,
13+
當出隊的時候我們希望按照给定的優先级出隊,我們按照 TDD(測試驱動開發) 的方式先來寫測試原始碼:
14+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
915
1016
```py
1117
def test_priority_queue():
@@ -22,7 +28,11 @@ def test_priority_queue():
2228
assert res == ['purple', 'orange', 'black', 'white']
2329
```
2430

31+
<<<<<<< HEAD
2532
上邊就是期望的行為,寫完測試原始碼後我們來撰寫優先級陣列的原始碼,按照出隊的時候最大優先級先出的順序:
33+
=======
34+
上邊就是期望的行為,寫完測試原始碼後我們來编寫優先级陣列的原始碼,按照出隊的時候最大優先级先出的顺序:
35+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
2636
2737

2838
```py

docs/17_二叉查找树/binary_search_tree.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,11 @@ bst = BST.build_from(NODE_LIST)
193193

194194
![](./find_successor.png)
195195

196+
<<<<<<< HEAD
196197
我們開始撰寫原始碼實現,和之前的操作類似,我們還是通過辅助函數的形式來實現,這個遞迴函數會比较复杂,請你仔細理解:
198+
=======
199+
我們開始编寫原始碼實現,和之前的操作類似,我們還是通過辅助函數的形式來實現,這個遞迴函數會比较复杂,請你仔细理解:
200+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
197201
198202
```py
199203
def _bst_remove(self, subtree, key):

docs/20_面试指南/interview.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
# 注意事項
22

33
- 电子簡历尽量用 pdf 格式,方便跨平台打開。doc 等格式在不同的电腦上打開會有排版問題,很多後端技術面試官可能使用的是 mac 或者 linux。
4+
<<<<<<< HEAD
45
- 提前复习回顧重點知识,防止卡在基础上。比如 mac 下著名的 brew 工具作者面試 google 就因為没寫出來反轉二叉樹被拒,後來去了苹果😂.(這就只能看人品和運气和眼缘了,如果没見到二面面試官或者 hr,大概率是挂了)。(樹、鏈表、哈希表、二分、快排、TCP/UDP、HTTP、資料庫ACID、索引優化等常考點)。
56
- 白板编程,練習在纸上手寫原始碼。雖然很多求职者都很抵触手寫原始碼,但是白板编程確實是一種比较好的區分方式。你的思考過程、编碼习惯、编碼規範等都能看出來。
7+
=======
8+
- 提前复习回顧重點知识,防止卡在基础上。比如 mac 下著名的 brew 工具作者面試 google 就因為没寫出來反轉二叉树被拒,後來去了苹果😂.(這就只能看人品和運气和眼缘了,如果没見到二面面試官或者 hr,大概率是挂了)。(树、鏈表、哈希表、二分、快排、TCP/UDP、HTTP、資料庫ACID、索引優化等常考點)。
9+
- 白板编程,练习在纸上手寫原始碼。雖然很多求职者都很抵触手寫原始碼,但是白板编程確實是一種比较好的區分方式。你的思考過程、编碼习惯、编碼規範等都能看出來。
10+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
611
- 如果被问到工程裡不會使用但是比较刁钻的算法题,建議你和面試官沟通的時候问问這個算法或者题目在開發中有哪些實際使用场景,看看對方怎麼說😎。少數公司喜欢考一些算法竞赛题,這種對於没有ACM,信息學竞赛背景的開發者來說比较吃力。大部分業務開發岗位應該只會考察基础算法题
712
- 面試的時候准备充分,簡历要與招聘方需求對等,甚至可以針對不同公司准备不同的簡历内容。笔者每次面試都會带上白纸、笔、簡历、电腦等,即使面試没過,至少也讓面試官感覺我是有诚意的,给對方留下好印象。
813
- 加分項:github、個人技術博客、開源項目、技術论坛帐号等,讓面試官有更多渠道了解你,有時候仅仅根據幾十分钟的面試來评判面試者是有失偏颇的。(比如面試者临场發挥不好;面試官個人偏好;會的都不问,问的都不會等)
@@ -12,17 +17,29 @@
1217
其實我個人是反對出纯算法题目的,尤其是有些比较刁钻的直接出算法竞赛题,這對與很多做工程的同學來說是比较吃亏的。没事的時候可以去 LeetCode 之類的網站刷刷基础题。
1318
一般來說 web 業務開發者掌握常見的编程语言内置算法和數據結構就够用了。
1419

20+
<<<<<<< HEAD
1521
- 練習手寫常見的算法,比如快排,二分,归並等,记住常見排序算法時間複雜度
22+
=======
23+
- 练习手寫常見的算法,比如快排,二分,归並等,记住常見排序算法時間複雜度
24+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
1625
- 逻辑正確是前提
1726
- 有图示描述思路最好,如果時間紧原始碼没寫出來,可以直接描述自己的思路。
1827
- 字不要寫太大,尽量工整。每行原始碼之間留有一定的空隙,方便你修改(甚至笔者之前會带上铅笔和橡皮手寫原始碼)
1928
- 如果實在寫不出來可以和面試官交流,很多時候如果给不出最優方案尽量想一個次優方案,别上來就說不會
2029
- 想不起來的函數名寫伪原始碼,一般面試官不會强制說讓你记住每個 api 的名字
30+
<<<<<<< HEAD
2131
- 如果有多餘的時間(一般不會有)注意一些邊界條件,防御性编程、原始碼風格、單元測試等東西,想好一些異常情况(空值、邊界值等)的測試用例
2232

2333
# 手寫原始碼注意事項
2434

2535
這裡我就直接引用《剑指offer》裡内容,大家寫原始碼的時候可以多加注意,對於應對算法面試,如果准备時間比较多,推荐看下這本书,並且刷一下
36+
=======
37+
- 如果有多餘的時間(一般不會有)注意一些邊界條件,防御性编程、原始碼風格、單元測試等東西,想好一些异常情况(空值、邊界值等)的測試用例
38+
39+
# 手寫原始碼注意事項
40+
41+
這裡我就直接引用《剑指offer》裡内容,大家寫原始碼的時候可以多加注意,對於应對算法面試,如果准备時間比较多,推荐看下這本书,並且刷一下
42+
>>>>>>> 5a8c8a841a113a157b455e473e224b3e4fb078ef
2643
leetcode 上的基础题目练练手感。
2744

2845
- 規範性:书寫清晰、布局清晰、命令合理

0 commit comments

Comments
 (0)