120 多個不斷更新的、互動式的、測試驅動的程式設計挑戰,帶有 Anki 抽認卡。
挑戰集中在編碼面試中發現的演算法和資料結構。
每個挑戰都有一個或多個參考解決方案,這些解決方案是:
挑戰很快就會提供按需增量提示,幫助您找到最佳解決方案。
筆記本也詳細說明:
還包括各種資料結構和演算法的單元測試參考實作。
提供的 Anki 抽認卡使用間隔重複來幫助您記住關鍵概念。
非常適合在旅途中使用。
正在尋找資源來幫助您準備系統設計和物件導向設計面試?
查看姐妹存儲庫《系統設計入門》,其中包含其他 Anki 甲板:
每個挑戰都有兩個筆記本,一個帶有單元測試供您解決的挑戰筆記本,一個供您參考的解決方案筆記本。
格式:挑戰類別 - 挑戰數量
挑戰總數:120
以下資料結構的單元測試、功能齊全的實作:
以下演算法經過單元測試、功能齊全的實現:
圖片來源
挑戰 | 靜態筆記本 |
---|---|
判斷字串是否包含唯一字符 | 挑戰 │ 解決方案 |
確定一個字串是否是另一個字串的排列 | 挑戰 │ 解決方案 |
判斷一個字串是否是另一個字串的旋轉 | 挑戰 │ 解決方案 |
壓縮字串 | 挑戰 │ 解決方案 |
反轉字串中的字符 | 挑戰 │ 解決方案 |
給定兩個字串,找到單一不同的字符 | 挑戰 │ 解決方案 |
找出總和為特定值的兩個索引 | 挑戰 │ 解決方案 |
實作哈希表 | 挑戰 │ 解決方案 |
實施嘶嘶聲 | 挑戰 │ 解決方案 |
查找字串中第一個不重複的字符 | 貢獻 │ 貢獻 |
刪除字串中指定的字符 | 貢獻 │ 貢獻 |
反轉字串中的單字 | 貢獻 │ 貢獻 |
將字串轉換為整數 | 貢獻 │ 貢獻 |
將整數轉換為字串 | 貢獻 │ 貢獻 |
添加挑戰 | 貢獻 │ 貢獻 |
挑戰 | 靜態筆記本 |
---|---|
從鍊錶中刪除重複項 | 挑戰 │ 解決方案 |
尋找鍊錶中倒數第 k 個元素 | 挑戰 │ 解決方案 |
刪除鍊錶中間的節點 | 挑戰 │ 解決方案 |
圍繞給定值對鍊錶進行分區 | 挑戰 │ 解決方案 |
將兩個數字相加,其數字儲存在鍊錶中 | 挑戰 │ 解決方案 |
找到鍊錶循環的起點 | 挑戰 │ 解決方案 |
判斷鍊錶是否為回文 | 挑戰 │ 解決方案 |
實作一個鍊錶 | 挑戰 │ 解決方案 |
確定列表是循環列表還是非循環列表 | 貢獻 │ 貢獻 |
添加挑戰 | 貢獻 │ 貢獻 |
挑戰 | 靜態筆記本 |
---|---|
使用單一數組實作 n 個堆疊 | 挑戰 │ 解決方案 |
實作一個追蹤其最小元素的堆疊 | 挑戰 │ 解決方案 |
實作一組堆疊類,包裝容量有限的堆疊列表 | 挑戰 │ 解決方案 |
使用兩個堆疊實作佇列 | 挑戰 │ 解決方案 |
使用另一個堆疊作為緩衝區對堆疊進行排序 | 挑戰 │ 解決方案 |
實作一個堆疊 | 挑戰 │ 解決方案 |
實作一個佇列 | 挑戰 │ 解決方案 |
實現由數組支援的優先權隊列 | 挑戰 │ 解決方案 |
添加挑戰 | 貢獻 │ 貢獻 |
挑戰 | 靜態筆記本 |
---|---|
在樹上實現深度優先搜尋(前序、中序、後序) | 挑戰 │ 解決方案 |
在樹上實現廣度優先搜索 | 挑戰 │ 解決方案 |
確定樹的高度 | 挑戰 │ 解決方案 |
從排序數組建立具有最小高度的二元搜尋樹 | 挑戰 │ 解決方案 |
為二元樹的每一層建立一個鍊錶 | 挑戰 │ 解決方案 |
檢查二元樹是否平衡 | 挑戰 │ 解決方案 |
確定一棵樹是否為有效的二元搜尋樹 | 挑戰 │ 解決方案 |
在二元搜尋樹中尋找給定節點的有序後繼節點 | 挑戰 │ 解決方案 |
尋找二元搜尋樹中的第二個大節點 | 挑戰 │ 解決方案 |
尋找最低共同祖先 | 挑戰 │ 解決方案 |
反轉二元樹 | 挑戰 │ 解決方案 |
實作二元搜尋樹 | 挑戰 │ 解決方案 |
實現最小堆 | 挑戰 │ 解決方案 |
實作一個字典樹 | 挑戰 │ 解決方案 |
在圖上實現深度優先搜索 | 挑戰 │ 解決方案 |
在圖上實現廣度優先搜索 | 挑戰 │ 解決方案 |
判斷圖中兩個節點之間是否存在路徑 | 挑戰 │ 解決方案 |
實現一個圖表 | 挑戰 │ 解決方案 |
在給定項目和依賴項清單的情況下尋找建置順序。 | 挑戰 │ 解決方案 |
找出加權圖中的最短路徑。 | 挑戰 │ 解決方案 |
找到未加權圖中的最短路徑。 | 挑戰 │ 解決方案 |
添加挑戰 | 貢獻 │ 貢獻 |
挑戰 | 靜態筆記本 |
---|---|
實施選擇排序 | 挑戰 │ 解決方案 |
實現插入排序 | 挑戰 │ 解決方案 |
實現快速排序 | 挑戰 │ 解決方案 |
實現歸併排序 | 挑戰 │ 解決方案 |
實作基數排序 | 挑戰 │ 解決方案 |
將字串陣列進行排序,使所有字謎詞彼此相鄰 | 挑戰 │ 解決方案 |
在已排序、旋轉的陣列中尋找項目 | 挑戰 │ 解決方案 |
在排序矩陣中搜尋項目 | 挑戰 │ 解決方案 |
找出不在 n 個整數的輸入中的 int | 挑戰 │ 解決方案 |
給定排序數組A,B,將B按排序順序合併到A中 | 挑戰 │ 解決方案 |
實現穩定的選擇排序 | 貢獻 │ 貢獻 |
使不穩定的排序變得穩定 | 貢獻 │ 貢獻 |
實現高效的就地版本的快速排序 | 貢獻 │ 貢獻 |
給定兩個已排序的數組,按排序順序將一個數組合併到另一個數組中 | 貢獻 │ 貢獻 |
在旋轉和排序的整數數組中尋找元素 | 貢獻 │ 貢獻 |
添加挑戰 | 貢獻 │ 貢獻 |
挑戰 | 靜態筆記本 |
---|---|
遞歸、動態、迭代地實現斐波那契 | 挑戰 │ 解決方案 |
最大化放置在背包中的物品 | 挑戰 │ 解決方案 |
最大化放置在背包中的無限物品 | 挑戰 │ 解決方案 |
找出最長公共子序列 | 挑戰 │ 解決方案 |
找出最長的遞增子序列 | 挑戰 │ 解決方案 |
最小化矩陣乘法的成本 | 挑戰 │ 解決方案 |
給定 k 筆交易,最大化股票價格 | 挑戰 │ 解決方案 |
給定一組硬幣,找出表示 n 美分的最少方法 | 挑戰 │ 解決方案 |
給定一組硬幣,找出表示 n 美分的唯一方法數 | 挑戰 │ 解決方案 |
列印 n 對括號的所有有效組合 | 挑戰 │ 解決方案 |
穿越迷宮 | 挑戰 │ 解決方案 |
列印集合的所有子集 | 挑戰 │ 解決方案 |
列印字串的所有排列 | 挑戰 │ 解決方案 |
尋找數組中的魔術索引 | 挑戰 │ 解決方案 |
求跑n步的方法數 | 挑戰 │ 解決方案 |
用 3 座塔和 N 個圓盤實現河內塔 | 挑戰 │ 解決方案 |
遞歸、動態、迭代地實現階乘 | 貢獻 │ 貢獻 |
對已排序的整數數組執行二分搜索 | 貢獻 │ 貢獻 |
列印字串的所有組合 | 貢獻 │ 貢獻 |
實現油漆填充功能 | 貢獻 │ 貢獻 |
給定 1、5、10、25 分硬幣,找出表示 n 分的所有排列 | 貢獻 │ 貢獻 |
添加挑戰 | 貢獻 │ 貢獻 |
挑戰 | 靜態筆記本 |
---|---|
產生質數列表 | 挑戰 │ 解決方案 |
找到數字根 | 挑戰 │ 解決方案 |
建立一個支援 insert、max、min、mean、mode 的類,時間複雜度為 O(1) | 挑戰 │ 解決方案 |
判斷一個數是否為2的冪 | 挑戰 │ 解決方案 |
兩個數字相加,不含 + 或 - 號 | 挑戰 │ 解決方案 |
減去兩個不帶 + 或 - 號的數字 | 挑戰 │ 解決方案 |
檢查一個數是否為質數 | 貢獻 │ 貢獻 |
決定笛卡兒平面上的兩條直線是否相交 | 貢獻 │ 貢獻 |
僅使用加法,實現整數的乘法、減法和除法 | 貢獻 │ 貢獻 |
求第 k 個數,使得唯一的質因數為 3、5 和 7 | 貢獻 │ 貢獻 |
添加挑戰 | 貢獻 │ 貢獻 |
挑戰 | 靜態筆記本 |
---|---|
實現常見的位元操作操作 | 挑戰 │ 解決方案 |
決定將 a 轉換為 b 時要翻轉的位數 | 挑戰 │ 解決方案 |
在螢幕上畫一條線 | 挑戰 │ 解決方案 |
翻轉一點以最大化最長的 1 序列 | 挑戰 │ 解決方案 |
取得下一個最大和下一個最小的數字 | 挑戰 │ 解決方案 |
合併兩個二進制數 | 挑戰 │ 解決方案 |
交換整數中的奇數位和偶數位 | 挑戰 │ 解決方案 |
列印 0 到 1 之間數字的二進位表示 | 挑戰 │ 解決方案 |
確定給定整數的二進位表示形式中 1 的數量 | 貢獻 │ 貢獻 |
添加挑戰 | 貢獻 │ 貢獻 |
挑戰 | 靜態筆記本 |
---|---|
尋找最多包含 k 個不同字元的最長子字串 | 挑戰 │ 解決方案 |
求三個數的最大乘積 | 挑戰 │ 解決方案 |
透過 1 次買入和 1 次賣出來最大化股票利潤 | 挑戰 │ 解決方案 |
將清單中的所有零移至末尾 | 挑戰 │ 解決方案 |
尋找所有其他 int 的產品 | 挑戰 │ 解決方案 |
給定出入口列表,找到最繁忙的時段 | 挑戰 │ 解決方案 |
確定島嶼的周長 | 挑戰 │ 解決方案 |
格式化許可證密鑰 | 挑戰 │ 解決方案 |
找到最長的絕對檔案路徑 | 挑戰 │ 解決方案 |
合併元組範圍 | 挑戰 │ 解決方案 |
分配cookie | 挑戰 │ 解決方案 |
確定您是否可以在 Nim 中獲勝 | 挑戰 │ 解決方案 |
檢查雜誌是否可用於創建勒索信 | 挑戰 │ 解決方案 |
求句子可以在螢幕上顯示的次數 | 挑戰 │ 解決方案 |
烏托邦樹 | 挑戰 │ 解決方案 |
最大化異或 | 挑戰 │ 解決方案 |
添加挑戰 | 貢獻 │ 貢獻 |
interactive-coding-challenges # Repo
├─ arrays_strings # Category of challenges
│ ├─ rotation # Challenge folder
│ │ ├─ rotation_challenge.ipynb # Challenge notebook
│ │ ├─ rotation_solution.ipynb # Solution notebook
│ │ ├─ test_rotation.py # Unit test*
│ ├─ compress
│ │ ├─ compress_challenge.ipynb
│ │ ├─ compress_solution.ipynb
│ │ ├─ test_compress.py
│ ├─ ...
├─ linked_lists
│ ├─ palindrome
│ │ └─ ...
│ ├─ ...
├─ ...
*筆記本 (.ipynb) 讀取/寫入關聯的單元測試 (.py) 檔案。
此自述文件包含 Binder 的鏈接,它在線託管存儲庫內容的動態筆記本,無需安裝。
跑步:
pip install jupyter
如需更最佳化地設定開發環境的詳細說明、腳本和工具,請查看 dev-setup 儲存庫。
有關筆記型電腦安裝的更多詳細信息,請按照此處的說明進行操作。
有關 IPython/Jupyter Notebooks 的更多資訊可以在此處找到。
挑戰以IPython/Jupyter Notebooks的形式提供,並已使用 Python 2.7 和 Python 3.x 進行了測試。
如果您需要安裝 IPython/Jupyter Notebook,請參閱 Notebook 安裝部分。
運行挑戰筆記本:
$ git clone https://github.com/donnemartin/interactive-coding-challenges.git
$ cd interactive-coding-challenges
$ jupyter notebook
這將啟動您的網頁瀏覽器,其中包含挑戰類別清單:
若要使用 pdb調試您的解決方案,請參閱以下票證。
注意:如果您的解決方案與解決方案筆記本中列出的解決方案不同,請考慮提交拉取請求,以便其他人可以從您的工作中受益。查看貢獻指南以了解詳細資訊。
挑戰、解決方案和單元測試以IPython/Jupyter Notebooks的形式呈現。
歡迎貢獻!
請查看貢獻指南,以了解有關如何執行以下操作的詳細資訊:
請隨時與我聯繫討論任何問題、疑問或意見。
我的聯絡資訊可以在我的 GitHub 頁面上找到。
我根據開源許可證向您提供此儲存庫中的程式碼和資源。因為這是我的個人儲存庫,所以您收到的我的程式碼和資源的許可證來自我,而不是我的雇主 (Facebook)。
Copyright 2015 Donne Martin
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.