现在是2025年,多数顶尖科技公司依然在编码面试中问类似LeetCode的问题。
但开始在LeetCode上做题比任何时候都难。面对超过3,000道题目,很容易感到不知所措和迷失方向。
- 你从哪里开始啊?
- 你应该解决哪些问题呢?
- 编码面试中需要解决多少问题合适?
- 你每个问题应该花多少时间?
在这篇文章里,我会回答这些问题以及其他,让你的旅程更顺畅,更少的痛苦。
先说一下背景——我解决了超过1,500道LeetCode题目,并成功通过了亚马逊、谷歌、微软等大公司面试。在这篇文章里,我会分享我的经验,帮助你更好地开始和进行LeetCode的练习。
我来分享一些实用的建议和资源,帮助你节约时间、保持集中并提升解决问题的能力,而不会感到太大的压力。
1. 你为什么要用 LeetCode 啊?你可能在想:为什么大家都在做LeetCode的题目……
真的非要找软件工程师不可吗?
简短的答案是:不见得。
许多初创公司和小型公司更看重你在特定技术栈上的经验和你参与过的项目。他们的面试中甚至可能根本不会出现LeetCode风格的问题。
但如果你的目标是在诸如亚马逊、谷歌或微软这样的科技巨头工作,你就需要练习力扣风格的题目类型,因为这是他们在面试中会问的题目。
2 选择哪种编程语言?这其实无所谓。
编程语言只是一种工具。一旦你理解了解决问题的思路,你就可以用任何语言来实现这个解决方案。
根据我的经验,给面试时,除非工作特别需要某种语言,你都可以用任何自己熟悉的语言,都会觉得自在。
关键是,LeetCode 并不是在考察语法,而是更注重你能否正确运用数据结构和算法,以及你是否有批判性思维和解决问题的能力。通过正确的数据结构和算法来展现你的思考能力和解决问题的能力。
不过,如果你是刚学编程的人,我建议从Python开始。它对初学者很友好,语法更简单。
如果你已经会一种语言——坚持下去。
无论是 C++、Java、C#、JavaScript、TypeScript 还是 Go,都不必换。
你不需要成为你选择语言的专家,但你应该知道一些基础,比如:
- 变量和数据类型
- 循环(for和while)
- if-else语句
- 数组和字符串,
- 函数和类
- 输入输出操作
除了基础之外,花点时间熟悉常用的数据结构和算法的内置功能。
这些库能帮你节省时间,让你专注于解决问题,而不是花时间在数据结构的实现上。
比如说
- Python 有列表、字典和集合。
- Java 有这些集合类型:ArrayList、HashMap 和 PriorityQueue。
- C++ 提供了 STL 库,其中包括列表、map 和 set。
- 了解基础知识
在开始做LeetCode题目之前,可以先了解一下数据结构和算法的基础,这很有帮助。
从理解开始:
- 大O符号 和 时间复杂度
- 基本的数据结构,例如 数组、字符串、链表、栈、队列、哈希表(Hash表)和二叉树。
- 包括基本算法如 排序技术、二分搜索和递归算法。
递归特别重要,因为许多问题,尤其是树和图相关的,这些问题很大程度上依赖于递归。
当你对这些话题熟悉时,就会更容易分辨哪个概念适用于具体问题。
你不需要一开始的时候就在每个主题上深入探讨,大部分的理解会在你解决问题时自然发展起来。
网上有很多资源可以帮助你开始,不要花时间寻找“完美的”资源——选一个开始学就行。
我们更应始终关注进步的空间,而不是追求完美。
这里有一些我发现很有用的资源。
关于 DSA 模式:AlgoMasterIO:这是我的另一个频道,我在这个频道上传一些有关 DSA 和 LeetCode 模式的动画教学视频。
这里有一份你应该熟悉的数据结构与算法面试中的编码题目全面列表,
如果你刚入门,每次只专注于一个主题,以免感到不知所措。
例如:从数组开始,然后转向字符串,再逐步进入更复杂的主题,如链表,哈希表,和二叉树。
这种方法能帮助你更深入地理解每个主题,并教你如何判断何时该使用特定的数据结构或算法。
一旦你掌握了某个主题的基础,并且知道怎么从头做起,就可以试试你的真功夫了。
做4或5个LeetCode上的简单问题吧。
这就:
- 加强你的学习效果,同时增强你把这些概念应用到实际中的信心。
如果你想更多地了解如何掌握一个DSA(数据结构与算法)主题,你可以查看这篇文章,我在里面讲得更详细。
我是如何掌握数据结构与算法的(16):我如何搞定DSA 5. 你应该解决哪些问题呢?如果你打开LeetCode,你会发现有3,000多道题目。
单单看到那个数字就可能感到不知所措。那么,你怎么决定先处理哪些呢?
从每个主题的简单题目开始。这些问题非常适合用来增强信心和理解解决问题的基本方法。
当你觉得那些简单的题目已经游刃有余了,就逐渐挑战一些稍难的问题,让自己逐渐走出舒适区。
记得,真正的成长发生在你不断挑战自己时。
一开始别担心难的问题。
编程面试大多集中在中等难度题目,你应该多花时间在这类题目上。
LeetCode 还提供最热门的 100 道题目 最受喜爱的 100 道题目 和面试高频 150 道题目 面试必做 150 道题目 这样的精选题库。
这些题做得很好,我强烈推荐你每个都做掉。
6. 你应该解决多少个问题?或者
6. 遇到和解决多少问题比较好?据我的经验,虽然没有一个神奇的数字,但是300道精心挑选的问题是最理想的选择。
不过,这不单单是解决任何300个问题。而是要专注于高质量的问题,这些问题涵盖最多主题和类型。
为了让你更轻松,我创建了一份免费资源:一份LeetCode的300道精选题目的列表,分为60个主题和模式,这些主题和模式是编码面试中最常遇到的。
你可以在algomaster.io,在练习页面中,你会发现一个结构化的题目集列表。你可以从上到下依次做这些题目。
这里你就能找到:
- 帮助你学习主题的资源。
- 能够追踪你的进度,并标记问题留待日后复习。
- 链接到GitHub和YouTube上的解答。
- 以及可以根据模式、难度和状态筛选问题的功能。
不要为了快速提高问题数量而匆忙行事。与其关注解决的问题数量,不如关注从每个问题中学到的东西。
与其浅尝辄止地解决五百个问题,不如深入理解并解决五十个问题。
解决了问题之后,再问自己什么呢?
- 这个解决方案为什么有效?
- 是什么关键的洞察让其他问题变得更容易解决?
尽量让它变得有趣。学习解决编码挑战非常有趣。这不仅仅是为了找工作。
8. 多关注学习模式化吧在 LeetCode 上变强最重要的就是尽可能多地学习各种模式。
与其专注于单独的问题,应该找到 潜在的模式,这些模式把相似的问题联系在一起。
在 LeetCode 上面,你会遇到很多类似的问题。一旦你解决了其中一个,就你可以用类似的方法解决其他的问题。
例如:学习了单调栈 技巧 之后,我解决了超过 10 道类似的题目。
我做了一个视频,总结了我在解决超过1500个问题后学到的15个最重要的LeetCode模式,你可以点击视频查看。你可以稍后抽空看看。
在algomaster.io上,我根据模式分类了问题。这让你可以一次专注于一个模式。通过这种方式,你会熟悉所有面试中常用的编码模式。
9. 怎样解决一个新问题? 1. 读两遍问题说明第一次做这件事时,专注于理解整体思路。题目具体让你做什么呢?
第二次阅读时,要注意具体的限制和条件。这些小细节往往能帮助你优化解决方案。
2. 看来看输入和输出的例子吧看看问题里给的例子。
一步一步地检查输入和输出,来理解问题是如何运作的。通过几个例子的实践,我发现这样做通常帮助我找到解决方案。
3. 用笔和纸画出来试试看。当你画出树和图的时候,许多相关的问题会变得更加容易理解。
尽量选择涵盖不同场景和输入大小的例子,并考虑到可能出现的任何特殊情况。
4. 从暴力破解法开始不要指望一开始就能立刻想到最完美的解决方案。
首先尝试用暴力法解决问题。虽然这种方法可能效率较低,但它可以作为你改进的起点。
5. 优化您的方案一旦你有了一个暴力解,就要开始优化它。
以下是一些需要注意的点:
- 利用未被充分利用的信息:寻找你可能遗漏的细节。例如,如果问题描述数组是已排序的,考虑利用这一点来使用二分查找或双指针方法。
- 预计算信息:如果某些计算被多次重复,考虑预先计算它们。使用诸如前缀和或频率计数等技术来避免冗余计算。哈希表在面试中经常被用到,你应该时刻想到这一点。
- 权衡时间与空间:有时,使用额外的内存(如哈希表)可以加速你的解决方案。
- 数据结构头脑风暴:考虑流行的数据结构,并尝试将每一种应用到手头的问题上。
避免让你的解决方案过于复杂。在每个阶段都问自己,“有没有更简单的方法?”。这样不仅让你的解决方案更易懂,还会减少编码时的错误。
7. 分析时间复杂度和空间复杂度发展分析每个你提交的问题的时间和空间复杂性的习惯。
10. 你打算给每个问题花多长时间?刚开始时,即使面对简单的问题,解决起来可能也需要一点时间。这完全正常——别灰心,不要因为一开始想不出来解决办法就感到沮丧。
你最初的主要目标应该是专注于学习的过程并深入理解问题的本质。只有当你花时间思考、犯错并不断调整你的方法时,真正的进步才会出现。
不过,有些复杂的问题包含特定的技巧或模式,除非你以前见过,否则很难弄清楚这些技巧或模式。
花费好几个小时却没有任何进展可能会适得其反。
有个不错的参考标准就行了
- 在每个问题上,给自己 30到60分钟 的专注时间会很有帮助。
- 如果你仍然卡壳了,看看提示或解决方案也没有关系。
先读官方提供的解答,试着看看LeetCode上的热门讨论帖中的解法。
不要只是看过解决方案后就直接跳过,试着弄清楚这个解决方案为什么有效。
从零开始重写解决方案,不要参考原来的代码。自己动手写可以帮助你更好地掌握这种方法,并且确保你真正理解背后的原理。
如果你第一次尝试没能解决问题,就把它标记为复查,几周后再来看看它。回顾问题有助于加强你的理解,并确保长期记住。
11. 不要死记硬背.最常见的错误之一是记住难题的解决方案,我自己也曾经犯过这个错误。
最初,这可能看起来像一种捷径,但实际上,它是一个重大失误,以下是三个主要原因:
- 你很快就会忘记硬背的解题方法。 不理解背后的逻辑,它们就不会留在你的记忆中。
- 你的解决问题的能力不会提高。 硬背跳过了批判性思维的过程,这才是练习编程问题真正价值所在。
- 你在面试中会遇到麻烦。 大多数面试官会询问问题的不同变体或后续问题,如果没有深入的理解,你就无法适应。
不要死记,而是要理解解题思路,哪怕需要花上几个小时。
一步步分解,并问问自己:
- 这种方法为什么管用?
- 简化问题的关键点是什么?
- 我怎样才能把这种方法用在类似的问题上?
长期来看,这种努力会有回报。你对内容理解得越深入,在面试中解释你的思路时,你会越有信心。
12. 限时练习
在面试中解决一个问题和在自己舒适的家里解决同一个问题有很大不同。
这就是为什么掌握了基础知识并解决了大约100到150个问题之后,给自己设定时间限制并进行限时练习是个好主意。
练习时打开计时器,试着在给定的时间内解决这个问题。
- 对于简单的题目,目标是在10到15分钟内完成。
- 对于中等难度的题目,设定一个30分钟的计时器。
- 对于难题,给自己一小时的时间。
让你的练习更进一步:
- 参加LeetCode比赛。
- 尝试通过模拟过去的LeetCode比赛来体验虚拟比赛。
一开始就算有一个问题你解不出来也没关系。这是正常的。目标是在限定时间内解决问题和积累经验。
刚开始参加比赛时,我只能解决1到2个问题。但是通过不断练习,我能够解决3个问题,最后在一些比赛中,我解决了所有问题。
13 记住你学到的东西在LeetCode上变得熟练不仅仅在于学新概念、解题,还在于长期记住这些知识。
这就是为什么你应该定期复习你已经解决过的概念和问题,特别是那些你感到特别棘手的。
试着再解决那些问题,不看答案。
通过不断练习和复习旧题,你会更容易长时间记住所学的东西。
我在这篇文章文章中更多地讨论了如何有效地改进 LeetCode 问题,所以不妨去看看这些问题。
14. 保持一致性要在 LeetCode 上变得厉害,需要花点时间。
有些话题可能要花上几周甚至几个月才能搞定,这也没问题。
别急,这很正常:在解决棘手的问题或理解复杂话题时感到卡壳或沮丧是完全正常的。
如果遇到棘手的问题,先休息一下,再用新的角度看它。
你刷得越多,你在 LeetCode 上解决问题的能力就会越强。
谢谢大家的阅读。
如果你觉得这很有用,就给个掌声 👏,以获取更多类似的内容。
如果你喜欢这篇文章,我认为你会喜欢我的免费通讯,在blog.algomaster.io,我写有关编码和系统设计面试的重要文章。你可以在 blog.algomaster.io 订阅。
来看看我的YouTube频道主页,里面有更多深入的内容。
关注我 LinkedIn、X 和 Medium,了解最新动态。
来看看我的GitHub仓库,里面有免费的面试准备资料。
希望你今天过得开心!
一会儿见,
阿什什