📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

I Found The HARDEST LeetCode Question (79% FAILURE RATE)

A Life Engineered17:59

Transcription

在这段视频中,我将着手回答这个问题:在 Fang 面试中,你可能遇到的最难的 LeetCode 问题是什么?我不是在寻找理论上的难题,其通过率只有 1%,也不是在寻找没有人尝试过的新问题。我指的是那些顶尖科技公司实际用来决定是否给你工作的、最具挑战性的问题。

我分析了数千个 LeetCode 问题,并发现了一些有趣的东西:真正困难的问题并不总是你所期望的那样。这为什么重要?因为出于某种原因,我们的行业已经决定,如果你想获得一份工作,你就必须当场解决极其困难的编码问题。

现在,有趣的地方来了。来自 interviewing.io 的新研究揭示了一些我意想不到的事情:专注于解决难题的工程师比那些解决了数百个中等难度问题的工程师更有可能在 Fang 公司工作,尽管简单和中等难度的题目占公司提问的大多数。

所以,如果你想增加在世界一流规模问题上工作的机会,在大科技公司获得声望和地位,最重要的是赚取巨额薪水,那么你来对地方了。如果你是频道的新朋友,欢迎你!我叫 Steve Fnn,是 YouTuber,以前被称为 Meta 或 Uncle Steve。我辞去了在亚马逊做了 18 年的首席工程师职业,以帮助尽可能多的人提升他们的技术职业生涯。如果你想从我这里获得更多信息,请订阅我的频道,加入我的免费每周通讯。如果你想将其中一些想法付诸实践,请加入我的 Discord 上的问责频道。所有链接都在描述中。

首先,让我们看看 interviewing.io 的有趣数据。他们分析了超过 10 万次技术面试的数据,并将其与 700 多人的 LeetCode 个人资料和 LinkedIn 工作经历进行了交叉引用。这篇文章非常精彩,向 interviewing.io 和 Mike Moraska 致敬,感谢他们创作了这篇文章。我在描述中提供了链接。但如果你不喜欢阅读,这里有四个关键要点:

第一点:开始就好。数据显示你解决问题的总数很重要,但有一个明确的上限,所以不要超过 500 个。但如果你是零,这一切都无关紧要。最重要的是你开始。看看图表,你已经达到了中位数,完成了 300 个问题。

第二点:不要忽视难题。难度级别比总数重要得多。为什么会这样?因为难题会迫使你结合多个概念,而简单和中等难度的题目通常只测试一个想法,比如执行深度优先搜索或扫描数组。难题需要你将多种技术拼凑在一起。你可能需要使用动态规划,同时维护一个滑动窗口,或者在跟踪前缀和的同时实现树遍历。

这里有一个基于他们数据的假设性例子:假设有两个虚构的工程师,Alex 解决了 690 个问题,其中 630 个是中等难度;Cara 总共解决了 210 个问题,其中 135 个是难题。根据数据,这两个人在面试中的表现可能会完全相同。没错,解决中等问题数量是五倍,总问题数量多 450 个的人,可能和解决难题数量少得多的人有相同的结局。

第四点(在文章中),但这里是第三点:除非你喜欢,否则不要担心竞赛。这实际上相当令人惊讶。竞赛表现与在顶尖科技公司获得工作之间没有相关性。所以,除非你真的喜欢竞争性编程,否则你的时间花在别处会更好。我认为原因在于,竞赛表现和面试成功需要不同的技能。在竞赛中,你在极大的时间压力下优化速度和完美解决方案。但在面试中,沟通和解决问题的能力比原始编码速度更重要。一个优秀的面试官可能会花 15 分钟思考和讨论他们的解决方案,然后再写任何代码。在竞赛中,这将是一场灾难。

这就引出了最后一个技巧:并非所有难题都一样。在选择要准备的问题时,请选择那些:一、有合理的通过率,意味着它们实际上是可解决的;二、在实际面试中经常出现;三、有多种有效的解决方案方法,这样你就可以从不同角度解决问题。如果你专注于依赖特定技巧的问题,你就无法最大化你的收益。

这让我开始思考,因为我喜欢最高级的词。最难的问题是什么,但它实际上比大多数中等甚至简单的问题更容易?但大科技公司喜欢问它。基本上,最简单的难题是什么?是什么单一的难题结合了最多的面试概念,并且被最多的 Fang 公司询问?换句话说,哪个问题能给你带来最大的收益?

最后,对我来说最有趣的问题是:在 Fang 面试中,你实际上可能遇到的最难的问题是什么?为了回答这些问题,我直接从源头获取了数据。LeetCode 有一个 GraphQL 端点,你可以直接访问。所以我使用 Postman 导出了所有 3,416 个问题的 JSON 数据,其中包括通过率和主题标签。但他们的模式(schema)似乎不是公开的。显然,公开模式是安全威胁向量,不是最佳实践。所以我无法以编程方式获取公司标签。我想收集在过去 6 个月里,由五家 Fang 公司报告的问题。我花了太长时间试图逆向工程 API 输入和查询来获取数据。所以我 resorted to 复制粘贴网页结果,并使用 Vim 正则表达式和命令行来清理数据并收集问题编号,我可以用这些编号来连接原始问题转储。

结果是:Meta 在过去 6 个月询问了 78 个难题;Google 285 个;Amazon 157 个;Apple 19 个;Netflix 总共 1 个。在我聚合和清理了这些数据之后,我就可以回答这些问题了。我写了一些简单的 Python 来解析 JSON,加载特定于公司的数据,并将它们连接起来。

让我们回答第一个问题:那个比其难度等级建议的更易于处理的难题。我们将通过四个关键因素来评估 Fang 面试中出现的每个难题。我们将通过接受率的平方来评分,因为我们希望人们能够真正解决问题。30% 的接受率比 10% 的接受率得分高九倍。然后乘以使用它的 Fang 公司数量,更多的公司意味着这是一个经过验证的面试问题。然后是主题标签数量的倒数,所以一个有两个主题的问题比一个有四个主题的问题得分更高。最后,问题 ID 的对数倒数会给旧问题一些轻微的提升,同时将新亮点包含在内。

当我们对 LeetCode 数据库中的每个难题运行这个公式时,我们的获胜者是“反转链表中的 K 个节点”。让我们来分析一下是什么让这个问题具有欺骗性的易处理性。乍一看,它看起来令人生畏。你需要获取一个链表并将其反转成 K 个节点的组。如果你有列表 1-2-3-4-5,并且 K=2,你会得到 2-1-4-3-5。如果 K=3,你会得到 3-2-1-4-5。

但这就是为什么这个问题在我们的分析中得分如此之高的原因:它实际上是建立在一个每个开发者都会学习的基本概念之上的——反转链表。如果你能反转一个经典的简单链表问题,你就已经完成了 80% 的工作。难的部分只是添加两个调整:一次只反转 K 个节点,并跟踪组之间的连接。这就是为什么这个问题尽管被标记为难题,却有如此高的通过率。它没有测试一些晦涩的算法或需要复杂的数学洞察力。它只是采用了一个大多数人已经知道的基本概念,并增加了一个复杂性级别。而这正是它成为 Amazon、Meta 和 Google 最爱的原因。它测试你是否能掌握一项基本技能并将其适应一个稍微复杂一点的场景,而这正是你作为一名软件工程师每天要做的事情,同时还要处理所有需要反转的链表。

我的分析还发现了其他令人惊讶的易于处理的难题。亚军“两个排序数组的中位数”的通过率较低,为 42%,但除了 Netflix 之外,所有 Fang 公司都询问了它。甚至排名第五的“机器人清洁工”也有高达 77% 的通过率。这告诉我们关于 LeetCode 排名的重要信息:有一些难题是易于处理的,它们并非都无法解决。

说到难题,让我们谈谈密码安全。在分析了数千个 LeetCode 问题后,我可以告诉你,即使是最难的编码挑战,也无法与凭证被泄露的噩梦相比。这就是 NordPass 的用武之地。NordPass 由 NordVPN 的同一批网络安全专家创建,它是一款密码管理器,有助于防止软件工程师夜不能寐的安全灾难。就像我们仔细分析这些问题以找到最有价值的问题一样,NordPass 帮助你智能且安全地管理你的凭证。

以下是 NordPass 对技术专业人士来说完美的原因:

* 他们的加密保险库安全地存储你所有的密码。

* 跨设备同步可在所有平台无缝工作。

* 数据泄露扫描程序会在你的凭证在暗网上泄露时提醒你。

* 安全共享允许团队安全地共享凭证和信用卡详细信息,而不会危及安全,这意味着不再有 DM 或电子表格中的密码。

* 他们的密码生成器确保你永远不会使用弱密码。

做一个专业人士,试试 NordPass 吧。免费试用 3 个月的 NordPass Business 不需要信用卡,使用代码 engineered 即可在 nordpass.com/engineered 获得。

再次感谢 NordPass 赞助今天的视频。

现在,让我们来回答第二个问题:找到那个能让你在面试准备中获得最大收益的难题。我们想要那个能教会你最多概念,同时又被 Fang 公司频繁询问的问题。

我们从 Fang 公司询问该问题的数量开始。这很重要,因为我们想要那些在他们最近的面试中持续出现的问题。然后乘以主题标签数量的平方。我们对其进行平方,因为我们真的想要那些结合了多个概念的问题。一个有四个主题的问题将比一个有两个主题的问题得分高四倍。接下来,我们以 0.5 的权重包含通过率。虽然我们不太关心这里的通过率,但我们仍然希望问题是合理可解决的。最后,我们再次使用问题 ID 的对数倒数,以给成熟的问题一些轻微的提升,同时将新问题包含在内。

当我们分析 LeetCode 中的每个难题时,我们的获胜者是“矩阵中的最长递增路径”,它是我们所寻找的完美例子。你得到一个数字网格,你的任务是找到最长的路径,其中每个数字都必须严格大于前一个。你可以向上、向下、向左或向右移动,但不能斜向移动。例如,在路径 1-2-6-9 中,每个数字都必须大于最后一个。

这个问题之所以好,是因为它结合了多个概念。你可能首先将其视为深度优先搜索问题,探索所有可能的路径。但然后你会意识到你需要动态规划,因为你反复解决相同的子问题。令人惊讶的是,它实际上是一个伪装的图问题。每个单元格都是一个节点,递增关系形成有向边。一些解决方案甚至使用拓扑排序来解决它。

这一个问题结合了八个不同的基本概念:数组、动态规划、深度优先搜索、广度优先搜索、图算法、拓扑排序、记忆化和矩阵运算。它是算法思维的典范,都集中在一个问题中。54% 的通过率使其具有挑战性,但绝对可解决,并且在过去 6 个月里已被 Amazon、Meta 和 Google 在面试中使用。

但这并不是我们发现的唯一亮点。让我向你展示一些能给你带来最多面试准备价值的问题:

第二名是“接雨水”,它结合了五种不同的技术,包括双指针、动态规划和堆栈操作。

第三名是“天际线问题”,它测试了七个概念,包括分治法、二进制索引树和堆操作。

第四名是“单词拆分 II”,它涵盖了从动态规划到 Trie 的七个领域。

第五名是“覆盖 K 个列表元素的最小范围”,它将六个概念结合在一起,包括滑动窗口和堆操作。

如果你正在为大科技公司的面试做准备,并想充分利用你的学习时间,这五个问题应该排在你的首位。它们就像编码问题的瑞士军刀,每个问题都教会了你将在面试武器库中需要的多种工具。

最后,让我们找到 Fang 面试问题的珠穆朗玛峰。这是你在实际情况中可能遇到的最难的问题。

我们从接受率平方的倒数开始。我们对其进行平方,因为我们真的想要最具挑战性的问题。一个通过率为 10% 的问题,得分将比一个通过率为 30% 的问题高九倍。然后我们乘以 Fang 公司询问它的数量。这很重要,因为我们只想要公司实际使用的问题,而不是理论上的怪物。接下来,我们乘以主题标签的数量。更多的标签意味着更多的复杂性,我们正在寻找那些以挑战性的方式结合了多个概念的问题。最后,我们再次使用问题 ID 的对数倒数,以给成熟的问题一些轻微的提升,同时将近期问题包含在内。

当我们对 LeetCode 数据库中的每个难题运行这个公式时,我们的获胜者是“将数组划分为两个数组以最小化其和之差”,它是某些问题之所以真正困难的完美例子。让我们来分析一下。你得到一个具有偶数个整数的数组,你需要将其分成两个等长的数组,同时最小化它们之和之间的差。听起来很简单,对吧?事实并非如此。对于大小为 2N 的数组,你实际上在考虑 2 的 N 次方种可能的分割方式。暴力方法将完全不切实际。最优解决方案需要多种高级技术的混合:你需要二分查找、动态规划和位操作协同工作。这就像一边下象棋一边玩鲁比克方块。

这个问题只有 21% 的通过率,是我们前五名中最低的,并且被 Google、Meta 和 Amazon 在面试中使用。它结合了七个不同的概念,从双指针到位掩码。事实上,这是一个相对较新的问题,但仍然名列前茅,这说明了一些问题:它不仅仅是理论上困难,它确实是一个顶尖公司正在积极用来测试候选人的挑战性问题。

虽然那是我们的获胜者,但我们前五名中的其他问题同样困难。

“正则表达式匹配”以 28% 的通过率位居第二。它要求你实现像 `regex` 这样的工具所使用的模式匹配。使其特别棘手的是处理通配符模式。如果你曾经想过为什么正则表达式既强大又令人痛苦,实现它就会告诉你原因。

“反向对”位居第三,听起来 deceptively simple,计算一个数字是另一个数字两倍以上的对的数量。但它结合了七个不同的概念,并需要像二进制索引树或段树这样的复杂数据结构来有效地解决它。

说到复杂性,“两个排序数组的中位数”排在第四位,有趣的是,这个问题也排在我们“秘密简单”类别的前列。当我们看评分标准时,这是完全有道理的。它有相对较高的通过率 42%,这提升了它的秘密简单分数。但除了 Netflix 之外,所有 Fang 公司都询问了它,并且结合了多个基本概念,这将其推到了我们“最难”列表的顶部。这表明从不同角度看待同一件事可以使其成为一个非常简单的问题,或者一个非常困难的问题,或者我的评分函数需要一些改进。

在我们的前五名中,排名第五的是“直线上的最大点数”,这是一个几何问题,它测试了你处理边缘情况和浮点精度问题的能力。通过率仅为 28%,并且除了 Netflix 之外,所有 Fang 公司都要求它。这是一个经典的难题,经受住了时间的考验。

好了,这就是全部内容。对我来说,这是一个非常有趣的项目。我进行了一些编码,玩了一些数据,并发现了一些 LeetCode 问题中令人着迷的模式。仅用几个简单的公式,我就能够识别出那些出奇地易于处理、对面试准备最有效,并且以重要的方式具有挑战性的问题。

如果你现在正在为面试做准备,请记住我们从 interviewing.io 的研究中学到的东西:你不需要解决 LeetCode 上的每一个问题。专注于深入理解问题,而不是匆忙地解决几百个问题。也许可以从我们今天确定的某些问题开始。

我很想在评论中听到你的想法。我应该以不同的方式分析这些数据吗?也许看看中等问题的模式?或者寻找测试特定概念的问题?请告诉我你想看什么。

如果你觉得这个视频有用,请记住,如果你没有得到回复和获得面试机会,这一切都无关紧要。请查看我关于如何在竞争激烈的科技市场中脱颖而出的视频。仅仅编码技能并不能让你获得新工作。