> For the complete documentation index, see [llms.txt](https://garylai.gitbook.io/algorithm-and-data-structure/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://garylai.gitbook.io/algorithm-and-data-structure/readme.md).

# 簡介

你好，我是這個筆記的作者 Gary ，這一本筆記是我在準備技術面試時，從零到拿到工作的筆記，如果你有機會來到這個筆記，很感謝你的造訪，不過我其實很希望在你在人生的任何一個階段，都不用接觸到這本筆記的任何內容 😂。

這個筆記的初衷是在於幫助我自己建立演算法觀念，以及練習如何應用演算法與資料結構\~\~（刷題）\~\~的筆記，是非常面試導向為目的的筆記，我自己也不喜歡這種方式，我相信大多數的工程師、喜愛寫程式的工程師、興趣使然的工程師，都在這個浩瀚的資訊世界裡面，有著個人的專長與興趣，而且可以發揮得非常好；然而就企業的角度來看，工程師的目的在於如何讓公司變現，這種升學考試型的面試方式，也是在商業與經濟考量下，失敗率最低的考察方式，儘管有很多的公司盡可能地去避免這種類似於升學考試的面試方法，不過從現今的發展方向來看，透過這種程式競賽題目來面試的趨勢還會是主流。

我也不是一個不是一個從小參與程式競賽或是大學時期念資工系出身的工程師。開始培養寫程式的興趣也只是曾經天真的想要創業，東拼西湊的走向了工程師這條路，也就是說一直以來，我都沒有真正的接受過系統性的演算法與資料結構學習，在我結束了創業生涯，開始於就業市場上找工作的時候，無可避免的我也需要走上了刷題準備面試的這條路，希望我的背景可以激勵你，我三十歲才開始走上這條路，我承認這是一條有點痛苦的路，希望我的筆記可以幫到你一點點，我的宏願也是希望我可以讓你刷題沒這麼痛苦。

目前這個筆記還非常雜亂，但是我有以下的目標

### 順利應付技術面試

這個筆記的目的**不在於求出最精簡的寫法，如一行解決題目的問題，我對於程式碼的容易閱讀程度的重視程度遠勝於精簡程度。**

每一篇筆記，我會盡量去寫出我是怎麼想到的，有哪些題目可以先做完後，幫助你想到後面的題目，並且透過有計劃的練習，從簡單寫到困難，並經由反覆的練習，去熟悉各種演算法與資料結構的核心與特性，最終在建立一個心流，就算遇到沒有看過的題目時，也可以知道應該要怎麼應用。

整本書的題目選題會盡量包含以下五種類型的題目

1. 最能夠幫助建立演算法與資料結構觀念的題目
2. 常考的經典題型，例如：有些無法一眼看出該如何選擇演算法與資料結構的題目
3. 大公司常見考題
4. 能有效幫助建立思維模式的題目
5. 熟悉以上題目後，可以幫助你複習的練習題

最終這本筆記的題數可還是會不少，我希望不要超過有三百題，我也會挑出最重要的一百題，希望讓讀者精讀後一百題即可足以應付面試，剩下的題目都只是練習左右。

這本書的題目選題不會包含以下這三大類

1. 第一類我稱為**人類智慧結晶題**，例如：有些題目存在著由頂尖數學家、科學家...等想到的演算法與資料結構，可以大大降低時間複雜度，在很小的機率裡面，有些公司可能真的會考，而且還有可能是你的夢想公司也可能會考，但是我還是不會選進來，因為人類智慧結晶題絕對不是那些頂尖大腦，在人生的某一刻花了四十五至六十分鐘，在求職壓力下找到答案的，如果公司真的考出了這樣的題目，我沒有覆蓋到，那我會祝福這間公司真的找到他們喜歡的人
2. 第二類型我稱為**奇淫技巧題**，LeetCode 上存在著很多題目需要透過特殊解法來解決問題的題目，這種類型的題目我都會直接跳過，如果公司真的考出了這樣的題目，我沒有覆蓋到，那我會祝福這間公司真的找到他們喜歡的人。
3. 第三類型我稱為**難以實作的常見重要演算法**，例如：網路流演算法，這類型的題目有點像是人類智慧結晶題，有很多重要的演算法概念是很簡單的，也是學校演算法課程中會強調的演算法，但是要實作起來非常的煩瑣，基本上題型也不會改變，這種類型的題目很難考察到一個人的反應，只能證明這個人真的很會記得演算法並實作，投資報酬率太低，如果公司真的考出了這樣的題目，我沒有覆蓋到，那我會祝福這間公司真的找到他們喜歡的人。

雖然說我是以面試為主，但是其實我也想把自己學習每個演算法的心得與每個核心價值、中心思想也一併討論，如果有人不是以面試為主導向的看此本書，也可以給他一點價值，目前我心中還沒有定論是要不要包含，因為我也怕包含了會讓篇幅變得很大，反而讓這本筆記失去了焦點，希望在這本書不斷的更新的同時，我也會有機會真的收到反饋，讓這本書越來越好。

### 技術面試的心態面

題目刷完只佔了一個技術面試的百分之五十，在技術面試的這一個環節，我也會去寫我是怎麼準備真正的面試的，還有在於我自己對於一些問題的看法，像是要不要做 Mock Interview 、花錢請人做的投資值不值得？我自己的準備過程是怎麼樣從零開始準備的，還有像是怎麼樣自己做 Mock Interview ，怎麼幫助別人做 Mock Interview ...等。

還有我也想放入我對於技術面試的看法。

### 各個公司的面試心得

了解各個公司的文化也是一個很重要的一環，我也會盡可能地整理並保持這個區塊的更新，目前我會考慮放入的章節有

1. 面試小公司和大公司的差異
2. 各間大公司面試的文化
3. 邀請我在各大公司的朋友請他們分享他們面試的經驗

但是我並不會收錄的各家公司的的題庫/面經。

以上是這個筆記的目標，希望大家都能拿到自己心目中理想的工作機會！
