造成启辰t方向盘卡顿的因素有哪些?,

如何正确的练习 LeetCode 问题



你做错了。 任何时候练习 LeetCode 问题时都可以使用“六个步骤”,最好是与另一个人一起练习。 保留一份面试准备日记来跟踪你的进展。

挣扎是真的

你是否一直在解决 LeetCode 问题,但在面试中却感觉自己并没有真正进步? 感觉自己能够想出解决方案,但始终无法达到最佳方案? 你是否总是在完成问题之前就没有时间了? 您是否总是很难解决困难的问题?

作为前谷歌软件工程师和现在的职业和面试教练,多年来我的许多客户都遇到过这个问题。 如果你是我的客户,我会告诉你,问题不在于你不够聪明。 也不是你不够努力。

很可能是你练习方法不对。

也许您已经完成了 Blind 75。或者您可能只是使用《破解编码面试》中的示例问题。 你可以从任何地方提出问题,我不在乎。 如果你使用了错误的策略,无论你练习多少问题,它都不会对你有多大帮助。

任何在健身房做过举重的人都知道,良好的姿势和灵活性至关重要。 这些元素对于充分发挥锻炼效果是必要的。 同样,在做 LeetCode 问题时,你需要练习良好的解题技巧,这样才能最大限度地利用时间。

牢记真实的面试

你们中的许多人都错误地练习 LeetCode 问题,因为您可能不熟悉技术面试在现实生活中的运作方式。 让我们快速分解一下。

最重要的是,您需要了解技术面试是一种协作解决问题的练习。 真正的面试不会是你自己解决 LeetCode 问题。 你将和一个真实的人交谈。 声明这一点很重要,因为如果您自己练习,您可能没有考虑到您需要与他人大声交流并提出问题这一事实。

LeetCode 问题的最大弱点是除了你自己之外没有其他人参与。 该问题需要提供您预先解决问题所需的所有细节。 在真正的面试中,你的面试官可能会隐瞒一些信息,以了解你如何处理歧义。 换句话说,他们想知道你是否要问问题。

此外,如果你方向错误,LeetCode 问题也无法给你提示。 它无法向您提供有关您的方法是否合理的反馈。 所有这些都很重要,因为你的面试官将评估你如何处理反馈。 如果我,作为你的面试官,问你是否可以优化你的解决方案,我会期待比“我不知道”更好的答案。

哦,顺便说一句,你的面试官没有义务为你提供示例或测试用例。 有些人这样做可能是为了提供帮助,这很好。 但如果你习惯了 LeetCode 问题中提供的所有内容,那么你在真正的面试中将很难想出好的例子和测试用例。

更好的方法

建立了必要的背景后,我们来谈谈我认为应该如何正确研究示例问题。 以下策略是我用来确保我从每个面试问题中获得最大收益的策略。 这些步骤将展示我如何应用我自己的问题解决框架(我称之为“六个步骤”)来练习面试问题。

1) 找一些东西来编码(不是 IDE)

在开始之前,请确保您已为模拟面试做好了正确的设置。 您可以选择使用白板、铅笔和纸,或者使用计算机和文本编辑器或轻量级代码编辑器(如 Notepad++ 或 TextPad)编写代码。 尽量避免使用功能齐全的 IDE,因为它们通常包含您在真正的编码面试中不太可能获得的功能。

如果您正在与模拟面试官合作,请确保选择他们也能够看到和编辑的内容。

2)决定是与模拟面试官一起练习(强烈推荐)还是自己练习

练习 LeetCode 问题的最佳方法是与另一个将作为面试官评估你的人一起练习。 现在这会让人震惊,但他们不一定需要成为一名程序员! 当然,拥有一位软件工程师或开发人员同事是理想的选择,但重要的是找到一个可以与您交谈并且可以为您提供反馈的人。 在准备 Google 面试的过程中,我依靠的是我的妻子,她绝对不是技术人员,但对我的表现和举止提供了很好的反馈。

当然,有时候你需要独自学习,那也没关系。 对你来说,重要的是要对自己负责,不要给自己比真实面试中模拟面试官更多的信息。

哦,无论你和谁一起工作,都要向他们表示感谢和赞赏。 您总可以做一些事情来补偿他们的时间,无论是金钱、咖啡、公开致谢还是礼品卡。

3)启动时钟

大多数面试的时间为 45-60 分钟。 根据您对真实面试的期望来决定您将花费多长时间进行模拟面试。 请记住,您希望事情尽可能现实。 一旦时间到了,就停止工作。 训练自己在有限的时间内做好工作很重要。

这里需要注意的是,如果您刚开始面试准备之旅,您可能只想对自己进行几次基准测试,看看自己的表现如何。 你仍然想给自己计时,但不要在特定时间停下来。 继续下去,直到找到最佳解决方案或想不出其他可做的事情为止。

4)阐明问题

您的模拟面试官将首先大声朗读问题。 在整个面试过程中,任何情况下都不要查看示例问题、示例或约束。 完全依赖模拟面试官来获取解决问题所需的任何信息。 这就是为什么在面试官讲话时做笔记是绝对必要的,这样你就不必反复询问他们已经透露的信息。

为了确保您正确听到问题并捕获所有细节,请用您自己的话向面试官重复问题。 如果您遗漏了任何细节或添加了不必要的内容,您的模拟面试官应该在继续之前告知您。

如果您自己练习,请与示例一起大声朗读问题一次。 完成后,将问题隐藏起来,然后用自己的话重复该问题,就像您实际上在与真人交谈一样。 记笔记,但避免写出完整的问题陈述。 专注于简短的陈述,帮助您记住正在解决的问题的关键部分。

5)提出问题并确认假设

这是任何面试的实用技巧。 始终以受访者的身份提出问题。 即使您认为自己知道如何解决问题的一切,即使您以前已经解决过该问题 - 仍然要问问题。 以下是您几乎可以针对任何技术问题提出的一些问题:

输入的数据类型和有效数据的范围是什么?

输入内容是否适合内存?

我会收到无效数据吗?

如何提供输入数据?

输入数据已经排序了吗?

请记住,您应该避免提出问题陈述本身已经有答案的问题。 然而,根据您对问题的理解,在面试官的听证会上重申您的假设是很重要的,也是值得鼓励的。 例如,如果问题提到对整数进行排序,您可能会假设您要对 32 位有符号整数进行排序。 清楚地陈述该假设或询问情况是否如此。 该问题实际上可能要求您对适合短整数的值进行排序,从而允许您节省空间(或长 64 位整数,这显然需要更多空间)。

如果您独自练习或与非技术人员一起练习,则不会有人回答您的问题。 一旦你记录了所有的问题和假设,你就可以在此时查看 LeetCode 约束并写下答案。

再次强调,尽量不要写太多。 最好用最少的单词来表达要点,这样你就不必把细节记在脑子里。

6)提出示例输入及其输出

此时,您应该开始研究示例。 这一步有两件事很重要。 第一,查看为您提供的所有示例并对它们进行逆向工程,以找出它们揭示了有关问题或其限制的哪些细节。 第二,添加几个您自己的示例来展示您对这些限制的理解或提出更多问题。 思考示例的一种方法是将它们视为测试用例。 如果您习惯性地难以想出好的测试用例,请阅读测试驱动开发 (TDD) 和单元测试作为面试准备的一部分。

给模拟面试官的注释。 如果受访者提出的例子违反了限制,请立即告知他们。 您有义务告知或提醒他们这种情况下的限制,因为此信息可能对他们解决问题至关重要。

再说一次,如果你独自学习,那么你就不会有人可以就你的例子提供反馈。 没关系。 仍然提出示例并对在此步骤中可能产生的任何未解答的问题做出最佳猜测假设。 LeetCode 的问题通常足够具体,所以这应该不难做到。

7) 集思广益解决方案并评估其 Big-O

您现在应该有足够的信息来开始提出问题的解决方案。 这是橡胶与道路的交汇处。 你对算法和数据结构的所有学习应该为你生成两到三种可行的方法来解决问题做好充分的准备。 如果你在这一步遇到很多困难,那就去看看书吧。 你还有更多的学习要做。

良好头脑风暴的第一步是很好地猜测 Big-O 中表达的最佳解决方案是什么样的。 是否可能存在恒定时间和恒定空间的解决方案? 为什么不? O(lg n) 的对数解怎么样? 请记住,您始终在寻求最佳解决方案。

举个例子,如果我需要对一个数组进行排序,我很确定在最坏的情况下我不能比 O(n) 时间复杂度和 O(1) 空间复杂度做得更好。 我声称线性时间复杂度是因为我可能必须至少查看输入的每个元素一次,并且我声称恒定空间是因为某些类型会移动元素,这样我就不需要使用单独的数据结构。

一旦你认为你知道了理想的情况,良好的头脑风暴的下一步就是提出解决方案并预测其时间和空间复杂性。 请注意,您的第一个解决方案可能是一种不太理想的暴力方法。 它也可能是您可以快速想出的唯一解决方案。 没关系! 如果这就是你几分钟后能想到的全部内容,那就继续吧。 但请花点时间尝试思考可以采取哪些措施来更接近理想的最佳解决方案。

一些原则在这里可能会有所帮助:

您通常必须使用更多空间(内存)才能使某些事情运行得更快(反之亦然),因此如果您正在优化速度,则可能需要使用数据结构。

如果您的任务是构建新的数据结构,您可能需要将两个相互补充的数据结构放在一起。 这意味着在学习中,您应该努力了解每种数据结构的优点和缺点以及它们旨在解决什么问题。

再次强调,只记录你的方法以及预期的时间和空间复杂性。 即使您不太确定,也要预先进行估计! 这可以帮助您在编写第一行代码之前通过潜在的优化进行导航。 您可能会发现,更优化的解决方案与您设计的最初解决方案一样容易实施,甚至更容易实施。

最后一件事。 您必须选择一个解决方案才能在下一步中开始实施。 您可以从面试官那里获取他们希望您实施哪一项的意见。 您也可以先实现最简单的版本,然后再编写最佳版本。 希望您能在这里找到一位出色的模拟面试官,他将为您提供良好的指导。

8)实施解决方案

现在是体验中最简单的部分。 如果您发现这不是最简单的,那么您需要花更多时间练习编写代码。 我这么说是有实际原因的。 您希望在这一步上花费最少的时间,以便可以将更多的时间投入到其他步骤中。 就像古老的谚语所说:“测量两次,切割一次。”

由于您处于人为限制的、有时间限制的时间表中,因此您还应该避免使用伪代码进行编写。 在现实生活中的面试中,伪代码通常不算数。 这意味着您必须将所有假代码变成真实代码才能正确评估。 我建议您对所提出的算法做一些小记录,而不是编写伪代码,而不是编写假代码,因为这可能会更快并提供相同的实用程序。

再次,我们谈论的是主要由大型科技公司使用的编码面试。 如果您可以对带回家的作业进行伪代码并在截止日期前完成,那就去做吧! 但在大技术层面,我向你保证,编写代码将是工作中最简单的部分。 了解您需要做的工作并审查您的设计可能是让您的工作充满挑战的主要因素。

一些技巧:

在写代码之前先说清楚你要做什么,然后再写代码。 在没有先解释你所写内容的情况下,不要编写代码。 这可以确保面试官知道你在想什么,并且在你走错路时有机会打断你。

使用良好、清晰的变量名称。 更喜欢详细(例如indexCount而不是idxCnt)。 在真正的面试中,你的面试官不会是唯一一个查看你的代码的人。 可读性非常重要,也是任何主要软件商店实行代码审查的原因之一。

不要害怕为您的语言使用常见的 API、语法糖和常见的惯用风格。 如果您有疑问,请询问面试官您是否可以使用某些东西。 更重要的是,了解幕后发生的事情,以便您了解任何性能损失。 例如,根据您的语言,对集合调用排序方法的成本在 O(n lg n) 或 O(n2) 之间。 仅调用该方法不会神奇地将您的代码变成恒定时间解决方案。

作为练习方案的一部分,凭记忆编写算法可以帮助您增强编程语言能力,同时也增强您对算法本身的理解

请记住,我强烈建议不要使用 IDE 来编写练习问题的解决方案。 如果您决定使用 LeetCode 编辑器,请不要编译和运行测试。 在大多数情况下,你实际上不会在真正的面试中得到这一点,即使你得到了,你也会想把它用作拐杖,而不是正确地浏览你的代码并测试它。 时间到了后,使用真正的编译器和单元测试!

如果您发现自己在实施过程中陷入困境,请使用示例并在纸上制定从输入到输出的步骤。 尝试在纸上想象你需要做什么,这样你就可以看到你的代码需要做什么,然后实现它。

9) 测试你的代码

输入最后一个分号或大括号后,您仍然没有完成。 您可能至少有一个错误、拼写错误或缺少变量需要修复。 逐行浏览代码,并检查每一行是否按照您设计的方式执行。 您应该在心里列出一些需要注意的事项:

未声明的变量

相差一误差

反转条件句(例如“<”而不是“>=”)

错误的变量名

空指针异常

这是在问题解决过程中尽早制定示例的重要原因之一。 您可以轻松地使用这些示例之一在心里运行代码并测试代码是否正常运行,使用纸和铅笔或文本编辑器来跟踪变量状态。

10)优化

如果您尚未达到最佳解决方案,请返回集思广益或实施您已经设计的更佳解决方案。 在计时器归零之前,您还有更多工作要做。 继续前进!

结束你的模拟面试

无论您是与合作伙伴一起练习还是自己练习,请务必记录对您表现的反馈。 将您所有的学习内容记在日记或笔记本上是组织技巧、资源和您自己的进步的一种非常有用的方式。 我仍然保留着我的模拟面试日记,其中只反映了我投入的一些成功工作。

如果您与模拟面试官一起工作,您应该回答两个问题:1)您对自己的表现有何看法,2)您的面试官如何评价您是否受聘、不受聘或持观望态度。 这两个问题的关键是弄清楚你的自我分配是否与面试官的一致。 这将帮助您在准备时形成正确的期望,从而建立信心并清楚地了解自己是否在朝着正确的方向前进。

也给你的面试官空间来批评你的非技术问题。 你的演讲是否经常结结巴巴或者使用不合逻辑的语句? 您是否发出任何应该避免的烦人的噪音? 采访过程中你是否长时间保持沉默? 这些反馈可能不会帮助你更好地编码,但它会帮助你更好地沟通,这是在技术面试中取得好成绩的一半挑战。

最后,既然你的面试已经结束,请随意将你的代码复制到 LeetCode 工具中,并确保它可以编译并且测试通过。 如果他们没有注意到您错过的任何边缘情况。 实际上,我建议复制到 IDE 中,以便您可以获得有关编译错误的更多详细信息或使用调试器单步调试代码。 记下失败或遗漏的边缘情况,以便您可以将它们添加到您解决的下一个编码问题的实施清单中。

2024-03-27

后面没有了,返回>>电动车百科