破解 Gayle Laakmann McDowell 的编码采访
破解 Gayle Laakmann McDowell 的编码采访
189 编程问题和解决方案
以清晰、简洁的方式交流思想和想法的能力是雇主寻求的一项绝对无价的技能。
拒绝一个好候选人总比雇用一个坏候选人好。
作为候选人,你可以在面试中传达的最重要的信息之一就是雇佣我会让你的生活更轻松。他们可以依靠你。你可以自己解决问题。
必备知识:
数据结构
链表、二叉树、尝试、堆栈、队列、数组、哈希表
算法
广度优先搜索、深度优先搜索、二分搜索、合并排序、快速排序、树插入/查找
概念
位操作、单例设计模式、工厂设计模式、内存(堆栈与堆)、递归、大 O 时间
解决技术问题的 5 个步骤:
1. 提出问题以解决歧义。
2. 设计算法。
3. 编写伪代码。
4. 编写代码。
5. 测试你的代码
测试极端情况(0、负、空、最大值)、用户错误(错误输入)和一般情况
5种算法方法:
1. 举例
写出具体的例子,看看你是否能找出一个普遍的规则。
2.模式匹配
算法类似于什么问题,你能修改这个问题的解决方案吗?
3.简化和概括
更改约束以简化问题,一旦有了算法,就可以概括问题。
4. 基础案例和构建
解决一个基本情况,然后更难。
5.数据结构头脑风暴
浏览数据结构并尝试应用每一个。
递归问题: 解决“基本情况”。求解 f(0) 或 f(1),然后求解 f(2)。了解如何使用以前的解决方案求解 f(3)。泛化为 f(n)。
每个递归问题都可以线性解决。递归占用空间更大,迭代更复杂。
在递归期间,我们可以为每个递归调用加 1。
堆栈和队列对于递归算法很有用。
自下而上: 解决简单的情况(一个元素)然后找出两个元素。从前一个案例中构建一个案例的解决方案。
自上而下的方法: 将案例 N 的问题划分为子问题。
递归运行时: O(分支^深度)。
冒泡排序: 从数组的开头开始,如果第一个大于第二个,则交换前两个元素。转到下一对,以此类推,不断扫描数组直到排序。 O(n²)。
选择排序: 使用线性扫描找到最小的元素并将其移到前面。然后,找到第二小的并移动它,再次进行线性扫描。继续这样做,直到所有元素都到位。 O(n²)。
合并排序: 对每对元素进行排序。然后,通过合并每两对对每四个元素进行排序。然后,每 8 个元素排序一次,等等。 O(nlogn)。
快速排序: 选择一个随机元素并对数组进行分区。然后对每一半,然后是每季度,等等。O(nlogn)。
桶排序: 将数组划分为有限数量的桶,然后单独对每个桶进行排序。 O(n + m),其中 n 是项目数,m 是不同项目数。
排列 = 字谜 = 不同顺序的相同字母。
回文 = 来回相同的顺序。
堆: LIFO,推,弹出;队列:先进先出、推送、移位。
队列用于广度优先搜索或实现缓存。
最小堆: 完全二叉树,每个节点都小于其子节点,根是最小的。
插入: 插入最右边的底部并冒泡。
提取分钟: 始终在顶部,删除顶部并与最右下角的节点交换并向下冒泡。
Robin-Karp 子串搜索: 将字符串视为 128 个基数,使用哈希函数对字符求和,相同的字符串将具有相同的哈希值。
一个*: 搜索成本最低的所有路径。
福特-富克森: 流网络中的最大流量。
背包: 一组具有权重的项目,获取适合集合的项目数。
迪克斯特拉斯: 带有权重的边图,找到节点之间的最短路径,将所有节点路径权重设置为无穷大。
哈密顿量: 找到访问每个节点一次的最短路径。
集团: 找到所有彼此相邻的顶点子集。
顶点覆盖: 接触图中所有边的一组顶点。
旅行推销员: 给定城市和距离列表,找到到每个城市的最短路径并返回。
IsNaN('123') -> 错误。
2 的幂: 2¹⁰ = 1024 = 1KB,2²⁰ = 1 MB,2³⁰ = 1 GB,2³⁴ = 4GB,2⁴⁰ = 1TB。
关闭: 将 JS 包装在一个函数中,避免潜在的名称冲突。
CSS 伪类: 悬停,激活,焦点,孩子,之前,访问。
Window.onLoad = 脚本和图像已准备好,document.onLoad = 脚本已准备好,图像尚未准备好。
DOM: getElementById、getElementByClassName、getElementByTagName、querySelectorAll。
CSS: element.classList.add(className)、.remove(className)、.toggle(className)、.contains(className)。
问题解决步骤:
1. 听。
2.调试示例。
3.特殊情况。
4.蛮力。
5.优化。
6. 浏览优化的解决方案。
7.清理代码。
8. 测试。
9.用特殊情况进行测试
二叉搜索树: 所有左边的后代 <= n < 所有右边的后代。
AVL 树和红黑树是平衡树。
完整的二叉树意味着除了最后一个从左到右填充的级别之外,每个级别都被完全填充。
全二叉树: 每个节点都有 0 或 2 个子节点。
完美二叉树: 既完整又完整。
中序遍历: 访问左分支,然后是当前节点,然后是右分支。
预购遍历: 访问当前节点,然后是左分支,然后是右分支。
深度优先搜索: 在我们走宽之前先深入。
广度优先搜索: 我们在他们的孩子之前探索每个邻居。更适合寻找最短路径。不是递归的,使用队列。
单例模式确保一个类只有一个实例,并确保通过应用程序访问该实例。
动态规划: 找到递归算法的重叠子问题并缓存这些结果以供将来调用。
在矩阵和板上映射时使用偏移量。
使用链表时使用 runner 技术或第二个指针。
漂亮的代码: 模块化,错误检查,使用类/结构/枚举,好的变量名。
数组和字符串算法思路: 首先或最后排序,首先进行扫描以收集信息,预先计算稍后使用的变量,首先进行错误检查,向前或向后迭代,随时跟踪。
链表算法思路: 使用while循环遍历链表,使用可以在主指针之前移动的运行器指针,首先使用运行器计算列表的长度。
栈和队列算法思路: 堆栈对象以保存除值之外的其他值。
树和图算法思路: 使用带递归的深度优先搜索,不使用广度优先搜索,按顺序遍历二叉搜索树创建一个排序数组,在遍历二叉搜索树时传递最小值和最大值,编写子方法来执行我们的详细计算经常跑。
递归和动态规划算法思路: 保留一个结构化的结果,我们可以将其传递给每个递归调用,创建辅助函数来进行重复计算。
最有效的代码并不总是最好的,您维护和阅读代码的能力很重要。
SharedFrom 双子✌️
Instagram: https://www.instagram.com/twosballer/
推特: https://twitter.com/TwosBaller
抖音: https://www.tiktok.com/@twosballer
领英: https://www.linkedin.com/in/parkeraklein
中等的: https://parkerklein.medium.com/
个人网站: https://www.parkerklein.com
SharedFrom 双子✌️
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」