我的 LeetCode 水平比其他玩家高出 99.9%:提升新手信心的指南
我是如何攻克 600 多道 LeetCode 题目的,以下是我的建议。
我想和大家分享一下我的故事,讲述我是如何从“十道题里连一道简单的都解决不了”到“能解决其他中等难度题目”的,以及我如何在 Meta、Booking、Careem、Avito 等公司参加过多次编程培训……
一切始于2022年底,当时我下定决心要加入一家FAANG公司。然而,正如你可能知道的,这需要掌握算法和数据结构方面的知识,而我恰恰缺乏这些知识,因为在日常工作中,你并不需要用到堆、树、不相交集和其他数据结构。所以,我几乎是从零开始。
这对我来说非常具有挑战性,因为我不知道从何入手,如何解决问题,也不知道哪些因素重要,哪些不重要。我还有一些疑问,比如要解决多少问题才能感到自信,以及我是否能够逐步过渡到中等难度的问题。即使是简单的问题也让我感到困惑,下面我会尝试帮助你解决这个问题。
当你想开始做 LeetCode 题目时,首先想到的就是打开题目页面https://leetcode.com/problemset/all/然后按顺序一道道来做。然而,即使你筛选出简单的题目,这也不是个好主意,因为很多标为“简单”的题目其实相当有挑战性。这可能会打击你的积极性,甚至降低你的自信心。
尖端:
-
第一条建议——关注通过率;通过率越高越好。这表明很多人都能解决这个问题,你也能成功的可能性也就越大。此外,你还可以参考学习计划,尝试解决其中的问题:
热门100题:一份高人气题目列表。如果一道题点赞数很高,那么它很可能不是那种会降低你评分的复杂题目。
面试热门150题:一份包含150道面试准备题目的列表。你很可能会在面试中遇到这些题目,但其中一些可能会比较难,尤其是在面试初期。LeetCode
75题:被誉为“面试准备必做题目列表”。这些题目按不同主题分类;请参考以下建议来解决它们。 -
第二个建议——从最基础的数据结构入手,例如数组(一维/二维)、集合、哈希表;你会经常遇到它们。例如,在很多问题中,添加集合或哈希表可以提高执行速度(但请记住,这可能会增加内存消耗)。只有在掌握了这些基础数据结构之后,你才应该深入学习其他数据结构,例如栈、队列、链表、树和图。LeetCode Explore
提供了一些卡片,解释了数据结构和算法,并附有练习题来巩固这些概念。如前所述,从数组和字符串等简单的卡片开始,逐步增加难度。我反复学习过这些卡片好几次,因为有些概念一开始并不清晰。如果遇到不清楚的地方,不要觉得有什么问题;过段时间再回来,你可能会发现自己已经理解了。 以下是一些其他资源:LeetCode Learn:包含解释和练习题的卡片。NeetCode Roadmap:包含主题和练习题的学习路线图;强烈推荐。Tech Interview Handbook:使用各种筛选条件创建每周学习计划。LeetCode 题型:按主题、难度和公司分类的 150 道热门题目的列表。 -
第三条建议——如果你找不到最优解,就先尝试“穷举法”。找到最优解后,思考如何改进它。
能否使用特定的数据结构?
数组是否已排序?
使用集合或哈希表会怎样?
是否有现成的模板可以应用?
如果所有方法都无效,而你已经花费了20-40分钟,那就自信地打开答案仔细研究。研究之后,关闭答案,再次尝试解题(这可能需要多次尝试,很正常)。如果多次尝试后仍然无法解决,可以考虑把答案写下来(我这样做过好几次)。但是,别忘了之后再重新审视这个问题,再次尝试解决。你一开始可能并不成功,这很正常。只需重复这些步骤,直到你充满信心为止。 -
第四条建议——仔细学习这14种编程模式,尤其要重点关注双指针、滑动窗口和快慢指针,因为这些模式经常会遇到。选择一个模式,在LeetCode题目页面找到与该模式相关的题目(可以使用“双指针”或“滑动窗口”等标签的筛选器),并练习足够多的题目来巩固你对该主题的理解。
-
第五条也是最重要的一条建议——练习、练习、再练习。一开始,我常常因为连简单的题目都解不出来而沮丧得想哭。这绝非夸张。“我真笨”的想法在我脑海里挥之不去,持续了好几个月。即使已经解决了600道题,还是会有自信心受挫的时候,尤其是遇到看似简单的题目却解不出来的时候。重要的是,每解决一道题,你都会比以前进步一些。
现在,解决 LeetCode 问题可以在Firecode平台上进行。该平台会按顺序呈现问题,从简单的题目开始,并回顾之前解决过的题目以巩固知识。平台提供各种主题的解释,并且在解决问题后,您可以查看其他人的解题思路,这对于理解不同的解题策略非常有帮助。
常问问题:
如果我无法解决问题,该怎么办?
如果30-40分钟后仍然无法解决问题,请先查看答案,并尝试寻找该问题的视频解法。在复习并理解之后,再尝试解决同一道题。如果仍然失败,请重复上述步骤。定期回顾以前遇到的问题,尤其是那些比较棘手的问题。我有时甚至会反复解决同一个问题10-15次或更多次。
在申请工作之前,我应该解决多少个问题?
每个人的情况都不一样。我花了六个月的时间,每天做几道题,大概做了300道题,才感觉打下了扎实的基础。而真正建立起信心,是在解决了400到500道题之后。有些人可能只需要解决100到200道题,但很遗憾,我不属于这一类。
哪种编程语言最适合解决问题?
简而言之——Python。我最初学的是PHP,后来转到Go,再后来是Java。看完一个视频后,我尝试了Python,之后就一直用它了。Python简洁的代码、内置函数(例如Counter、defaultdict、divmod、lambda等)以及速度优势在面试中非常实用。
如何抽出时间解决问题?
我的目标是每天解决两道题,一道在上班前,一道在下班后。周末,我会投入更多时间,观看视频、阅读文章、解决更多问题,并复习以前的题目以巩固知识。
LeetCode高级版值得购买吗?
高级版最实用的功能是能查看哪些公司出过特定题目。如果是准备特定公司的考试,建议使用高级版;否则,免费版就足够了。你可以在 Neetcode 等频道找到视频讲解。
购买 eduative.io 的访问权限值得吗?
虽然在 educative 上有很多关于 Grokking Coding Interview Patterns 课程的推荐,但我个人觉得它用处不大。视觉讲解是唯一的优点。在我看来,看 YouTube 视频是更好的选择。
购买 algoexpert.io 的使用权值得吗?
在我看来,algoexpert.io 是一个非常实用的资源。每个问题都配有 30-50 分钟的详细视频讲解。他们经常有促销活动,有时只需 99 美元就能获得一年的所有课程。价格合理,网站界面友好,测试用例丰富,编辑器也十分人性化。
结果:
- 我实现了解决算法问题的最初目标——通过编程面试,这是FAANG公司面试的关键一步。我成功通过了好几轮面试,最重要的是,我不再害怕这个阶段了。
- 对数据结构的理解更加深入。从一开始不知道堆是什么,到现在我对这种结构以及其他数据结构都有了全面的了解。
- 工作中改变了我对代码的看法。现在我可以找出哪些地方可以更有效地利用内存或降低时间复杂度。
- 最后但同样重要的是——大脑健康。从“不想做”转变为“每天都想解决问题”。
实用链接:
- NeetCode YouTube频道——可能是最有帮助的频道,它以通俗易懂的方式解释各种概念。
- William Fiset 的 YouTube 频道- 有许多解释各种数据结构的实用视频。
- BackToBackSWE YouTube 频道- 在白板上讲解数据结构和问题。
- Inside Code YouTube频道
- Geekific YouTube频道
- Michael Muinos YouTube频道
- Nick White YouTube频道
- TechLead YouTube频道
- Coursera - 算法第一部分(俄语) - 很多人推荐;我个人没有上过这门课。
俄语版本:https://habr.com/ru/articles/786184/
文章来源:https://dev.to/idsulik/empowering-newbies-building-confidence-through-600-leetcode-solutions-a-guide-for-beginners-3960
