交互式编码-挑战
120多项持续更新、交互式和测试驱动的编码挑战,具有Anki flashcards
挑战集中在算法和数据结构在以下位置找到编码面试
每个挑战都有一个或多个参考解决方案,它们是:
- 全功能
- 单元测试
- 通俗易懂
Challenges将很快提供按需服务incremental hints以帮助您获得最佳解决方案
笔记本还详细介绍了:
- 约束条件
- 测试用例
- 算法
- 大O时空复杂性
还包括单元测试的参考实现各式各样的data structures和algorithms
挑战解决方案
Anki抽认卡:编码与设计
提供的Anki flashcard deck使用间隔重复来帮助您记住关键概念
非常适合在旅途中使用
设计资源:系统设计入门
寻找资源来帮助您准备系统设计和面向对象的设计访谈?
查看姊妹回购The System Design Primer,其中包含其他Anki甲板:
笔记本结构
每个挑战有两个笔记本,一个挑战笔记本有要解决的单元测试和解决方案笔记本以供参考
问题陈述
- 陈述要解决的问题
约束条件
- 描述任何约束或假设。
测试用例
- 描述将在单元测试中评估的常规测试用例和边缘测试用例。
算法
- [挑战笔记本]空,如果需要提示,请参阅解决方案笔记本算法部分
- [解决方案笔记本]一个或多个算法方案讨论,时间和空间复杂度大O
提示
- [挑战笔记本]提供按需服务incremental hints来帮助你找到最优的解决方案。马上就来!
代码(挑战:实现我!)
- [挑战笔记本]供您实现的骨架代码
- [解决方案笔记本]一个或多个参考解决方案
单元测试
- [挑战笔记本]代码的单元测试。预计在你解决挑战之前都会失败
- [解决方案笔记本]参考解决方案的单元测试
索引
挑战类别
格式化:挑战类别-挑战数量
- Arrays and Strings-10
- Linked Lists-8
- Stacks and Queues-8
- Graphs and Trees-21
- Sorting-10
- Recursion and Dynamic Programming-17
- Mathematics and Probability-6
- Bit Manipulation-8
- Online Judges-16
- System Design-8
- Object Oriented Design-8
挑战总数:120项
参考实现:数据结构
以下数据结构经过单元测试、功能齐全的实现:
参考实现:算法
以下算法经过单元测试、功能齐全的实现:
- Selection Sort
- Insertion Sort
- Quick Sort
- Merge Sort
- Radix Sort
- Topological Sort
- Tree Depth-First Search (Pre-, In-, Post-Order)
- Tree Breadth-First Search
- Graph Depth-First Search
- Graph Breadth-First Search
- Dijkstra’s Shortest Path
- Unweighted Graph Shortest Path
- Knapsack 0/1
- Knapsack Unbounded
- Sieve of Eratosthenes
参考实现:TODO
- A*
- Bellman-Ford
- Bloom Filter
- Convex Hull
- Fisher-Yates Shuffle
- Kruskal’s
- Max Flow
- Prim’s
- Rabin-Karp
- Traveling Salesman
- Union Find
- Contribute
安装和运行挑战
杂项
挑战
数组和字符串
挑战 | 静电笔记本 |
---|---|
确定字符串是否包含唯一字符 | Challenge│Solution |
确定一个字符串是否为另一个字符串的排列 | Challenge│Solution |
确定一个字符串是否为另一个字符串的旋转 | Challenge│Solution |
压缩字符串 | Challenge│Solution |
颠倒字符串中的字符 | Challenge│Solution |
给定两个字符串,找到单个不同的字符 | Challenge│Solution |
查找两个总和为特定值的索引 | Challenge│Solution |
实现哈希表 | Challenge│Solution |
实施冒泡嗡嗡声 | Challenge│Solution |
查找字符串中的第一个非重复字符 | Contribute│Contribute |
删除字符串中的指定字符 | Contribute│Contribute |
颠倒字符串中的单词 | Contribute│Contribute |
将字符串转换为整数 | Contribute│Contribute |
将整数转换为字符串 | Contribute│Contribute |
添加质询 | Contribute│Contribute |
链表
挑战 | 静电笔记本 |
---|---|
从链接列表中删除重复项 | Challenge│Solution |
查找链表最后一个元素的第k个元素 | Challenge│Solution |
删除链表中间的节点 | Challenge│Solution |
围绕给定值对链表进行分区 | Challenge│Solution |
将数字存储在链表中的两个数字相加 | Challenge│Solution |
查找链接列表循环的起点 | Challenge│Solution |
确定链表是否为回文 | Challenge│Solution |
实现链表 | Challenge│Solution |
确定列表是循环的还是非循环的 | Contribute│Contribute |
添加质询 | Contribute│Contribute |
堆栈和队列
挑战 | 静电笔记本 |
---|---|
使用单个数组实施n个堆栈 | Challenge│Solution |
实现跟踪其最小元素的堆栈 | Challenge│Solution |
实现包装容量受限堆栈列表的一组Stacks类 | Challenge│Solution |
使用两个堆栈实现一个队列 | Challenge│Solution |
使用另一个堆栈作为缓冲区对堆栈进行排序 | Challenge│Solution |
实现堆栈 | Challenge│Solution |
实现一个队列 | Challenge│Solution |
实现由数组支持的优先级队列 | Challenge│Solution |
添加质询 | Contribute│Contribute |
图形和树
挑战 | 静电笔记本 |
---|---|
在树上实现深度优先搜索(前、中、后顺序) | Challenge│Solution |
实现树的广度优先搜索 | Challenge│Solution |
确定树的高度 | Challenge│Solution |
从排序数组创建高度最小的二叉搜索树 | Challenge│Solution |
为二叉树的每个级别创建链表 | Challenge│Solution |
检查二叉树是否平衡 | Challenge│Solution |
确定树是否为有效的二叉搜索树 | Challenge│Solution |
在二叉搜索树中查找给定节点的有序后继节点 | Challenge│Solution |
查找二叉树中的第二大节点 | Challenge│Solution |
找到最底层的共同祖先 | Challenge│Solution |
反转二叉树 | Challenge│Solution |
实现二叉搜索树 | Challenge│Solution |
实现最小堆 | Challenge│Solution |
实现Trie | Challenge│Solution |
在图上实现深度优先搜索 | Challenge│Solution |
实现图的广度优先搜索 | Challenge│Solution |
确定图中的两个节点之间是否存在路径 | Challenge│Solution |
实现图形 | Challenge│Solution |
在给定项目和依赖项列表的情况下查找构建顺序 | Challenge│Solution |
在加权图中查找最短路径 | Challenge│Solution |
在未加权图中查找最短路径 | Challenge│Solution |
添加质询 | Contribute│Contribute |
排序
挑战 | 静电笔记本 |
---|---|
实现选择排序 | Challenge│Solution |
实现插入排序 | Challenge│Solution |
实现快速排序 | Challenge│Solution |
实现合并排序 | Challenge│Solution |
实现基数排序 | Challenge│Solution |
对字符串数组进行排序,以便所有字谜都相邻 | Challenge│Solution |
在排序的旋转数组中查找项 | Challenge│Solution |
在排序矩阵中搜索项目 | Challenge│Solution |
在n个整数的输入中查找不是的整数 | Challenge│Solution |
给定排序数组A、B,按排序顺序将B合并到A中 | Challenge│Solution |
实现稳定选择排序 | Contribute│Contribute |
使不稳定排序稳定 | Contribute│Contribute |
实现高效的就地版本的快速排序 | Contribute│Contribute |
给定两个排序的数组,按排序顺序将一个合并到另一个 | Contribute│Contribute |
在经过旋转和排序的整数数组中查找元素 | Contribute│Contribute |
添加质询 | Contribute│Contribute |
递归与动态规划
挑战 | 静电笔记本 |
---|---|
递归、动态和迭代地实现Fibonacci | Challenge│Solution |
最大化放置在背包中的物品 | Challenge│Solution |
最大化放置在背包中的无界项目 | Challenge│Solution |
查找最长的公共子序列 | Challenge│Solution |
找出最长的递增子序列 | Challenge│Solution |
最小化矩阵乘法的成本 | Challenge│Solution |
在给定k个交易的情况下最大化股票价格 | Challenge│Solution |
在给定一组硬币的情况下,找出表示n美分的最小方法数 | Challenge│Solution |
在给定一组硬币的情况下,找出表示n美分的唯一数量的方法 | Challenge│Solution |
打印n对括号的所有有效组合 | Challenge│Solution |
在迷宫中导航 | Challenge│Solution |
打印集合的所有子集 | Challenge│Solution |
打印字符串的所有排列 | Challenge│Solution |
在数组中查找魔术索引 | Challenge│Solution |
找出运行n个步骤的方式的数量 | Challenge│Solution |
用3个塔和N个圆盘实现河内之塔 | Challenge│Solution |
递归、动态和迭代地实现阶乘 | Contribute│Contribute |
对已排序的整数数组执行二进制搜索 | Contribute│Contribute |
打印字符串的所有组合 | Contribute│Contribute |
实现绘画填充功能 | Contribute│Contribute |
给出1、5、10、25美分硬币,找出代表n美分的所有排列 | Contribute│Contribute |
添加质询 | Contribute│Contribute |
数学与概率
挑战 | 静电笔记本 |
---|---|
生成素数列表 | Challenge│Solution |
找到数字根 | Challenge│Solution |
在O(1)中创建支持插入、最大、最小、平均、模式的类 | Challenge│Solution |
确定一个数字是否为2的幂 | Challenge│Solution |
将不带+或-号的两个数字相加 | Challenge│Solution |
减去两个不带+或-号的数字 | Challenge│Solution |
检查数字是否为质数 | Contribute│Contribute |
确定笛卡尔平面上的两条直线是否相交 | Contribute│Contribute |
仅使用整数的加法、减法和除法实现乘法、减法和除法 | Contribute│Contribute |
找出第k个数,使其唯一的素因数为3、5和7 | Contribute│Contribute |
添加质询 | Contribute│Contribute |
位操作
挑战 | 静电笔记本 |
---|---|
实现常见的位操作操作 | Challenge│Solution |
确定要翻转以将a转换为b的位数 | Challenge│Solution |
在屏幕上画一条线 | Challenge│Solution |
翻转一位以最大化最长的1序列 | Challenge│Solution |
获取下一个最大和下一个最小的数字 | Challenge│Solution |
合并两个二进制数 | Challenge│Solution |
交换整数中的奇数位和偶数位 | Challenge│Solution |
打印介于0和1之间的数字的二进制表示法 | Challenge│Solution |
确定给定整数的二进制表示中的1的个数 | Contribute│Contribute |
添加质询 | Contribute│Contribute |
网上评委
挑战 | 静电笔记本 |
---|---|
查找最多包含k个不同字符的最长子字符串 | Challenge│Solution |
找出三个数字的最高乘积 | Challenge│Solution |
通过1次买入和1次卖出最大化股票利润 | Challenge│Solution |
将列表中的所有零移动到末尾 | Challenge│Solution |
找出所有其他整数的乘积 | Challenge│Solution |
给出进场和出场的列表,找出最繁忙的时段 | Challenge│Solution |
确定岛屿的周长 | Challenge│Solution |
格式化许可证密钥 | Challenge│Solution |
查找最长的绝对文件路径 | Challenge│Solution |
合并元组范围 | Challenge│Solution |
分配Cookie | Challenge│Solution |
确定您是否可以在NIM中获胜 | Challenge│Solution |
检查一本杂志是否可能被用来制作赎金字条 | Challenge│Solution |
找出一个句子可以在屏幕上显示的次数 | Challenge│Solution |
乌托邦之树 | Challenge│Solution |
最大化异或 | Challenge│Solution |
添加质询 | Contribute│Contribute |
回购结构
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回购
有关笔记本安装的更多详细信息,请按照说明操作here
有关IPython/Jupyter笔记本的更多信息,请访问here
跑步挑战
笔记本电脑
挑战以以下形式提供IPython/Jupyter笔记本电脑一直以来都是使用Python 2.7和Python 3.x进行测试
如果您需要安装IPython/Jupyter笔记本,请参阅Notebook Installation部分
- 本自述包含指向以下内容的链接nbviewer,哪些主机静电笔记本回购的内容
- 中的元素进行交互或修改动态笔记本,请参阅以下说明
运行挑战笔记本:
$ git clone https://github.com/donnemartin/interactive-coding-challenges.git
$ cd interactive-coding-challenges
$ jupyter notebook
这将启动包含质询类别列表的Web浏览器:
- 导航到挑战笔记本你想要解决
- 运行挑战笔记本中的单元格(单元格->全部运行)
- 这将导致预期的单元测试错误
- 解决挑战并验证它是否通过了单元测试
- 查看随附的解决方案笔记本以供进一步讨论
至调试您的PDB解决方案,请参阅以下内容ticket
注意:如果您的解决方案与解决方案笔记本中列出的解决方案不同,请考虑提交Pull请求,以便其他人可以从您的工作中受益。回顾Contributing Guidelines有关详细信息,请参阅
未来发展方向
挑战、解决方案和单元测试以IPython/Jupyter笔记本电脑
- 笔记本目前主要包含Python解决方案(在Python2.7和Python3.x上都进行了测试),但可以进行扩展以包括40+ supported languages
- 回购将是不断更新新的解决方案和挑战
- Contributions欢迎光临!
贡献
欢迎投稿!
回顾Contributing Guidelines有关如何执行以下操作的详细信息,请执行以下操作:
- 提交问题
- 为现有挑战添加解决方案
- 添加新的挑战
学分
资源
- Cracking the Coding Interview|GitHub Solutions
- Programming Interviews Exposed
- The Algorithm Design Manual|Solutions
- CareerCup
- Quora
- HackerRank
- LeetCode
图像
- Arrays and Strings: nltk.org
- Linked Lists: wikipedia.org
- Stacks: wikipedia.org
- Queues: wikipedia.org
- Sorting: wikipedia.org
- Recursion and Dynamic Programming: wikipedia.org
- Graphs and Trees: wikipedia.org
- Mathematics and Probability: wikipedia.org
- Bit Manipulation: wikipedia.org
- Online Judges: topcoder.com
联系信息
请随时与我联系,讨论任何问题、问题或评论
我的联系信息可以在我的GitHub page
许可证
我在开放源码许可下向您提供此存储库中的代码和资源。因为这是我的个人存储库,您获得的我的代码和资源的许可证来自我,而不是我的雇主(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.