ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

力扣刷题进阶指南:从看懂题解到面试手撕代码的完整方法

力扣刷题进阶指南:从看懂题解到面试手撕代码的完整方法 简介这份资源是面向算法学习者与求职面试者的力扣原题解题代码合集适合希望系统刷题、巩固数据结构与算法基础的初中级程序员。压缩包共116个文件以cpp源码、exe可执行程序、obj目标文件、pch预编译头、pdb调试信息及ilk链接文件为主另含少量idb文件整体约2.96MB可直接运行验证结果。内容覆盖二进制求和、解码方法、打家劫舍、多数元素、最大数、数字范围按位与、快乐数、长度最小的子数组、计数质数等经典题型涉及动态规划、位运算、数组与数学等主题每份代码均经过验证可正确输出。目前已有1546人学习下载读者可借此复习基础算法、学习不同解题思路与优化技巧并模拟面试场景进行针对性训练。1. 力扣原题到底该怎么刷从「看题解就懂」到「面试手撕」的鸿沟很多人刷力扣原题时都有过这种体验打开一道中等题看五分钟没思路直接翻题解看完觉得「哦原来是这样」然后关掉页面。过一周再遇到同类题还是不会。问题不在于智商而在于刷题方式本身是「消费题解」而不是「生产解法」。力扣官网上的题目总量已经超过三千道热门 100 题和 Hot 100 列表常年被反复刷但真正能在面试白板上手写出 bug-free 代码的人靠的从来不是刷题数量而是对题型骨架的拆解和反复默写。这篇笔记面向的是正在准备技术面试、或者想系统提升算法能力的工程师我会把力扣原题从选题、拆解、手写到复盘的全链路讲清楚包括我踩过的坑和现在还在用的具体方法。2. 选题策略力扣热门 100 题和周赛题到底先刷哪个2.1 力扣热题 100 的题型分布与优先级力扣热题 100Hot 100是官网根据面试出现频率和维护成本筛选出来的列表覆盖了数组、链表、哈希表、双指针、滑动窗口、二叉树、动态规划、回溯、贪心、栈和队列等核心题型。但很多人不知道的是这 100 道题里动态规划占了将近 20 道而动态规划恰恰是新手最容易卡住的地方。如果按顺序从第一题刷到最后一题很可能在第三十题左右就被 DP 劝退。我一般会建议按「题型簇」来刷而不是按题号顺序。具体做法是先把数组和哈希表相关的题集中刷完再刷链表和二叉树最后集中攻克动态规划和回溯。这样做的原因是同一题型簇内的解题模板高度相似集中刷可以在短时间内形成肌肉记忆。下面是我自己用的题型优先级排序表按面试出现频率和上手难度综合排列优先级题型簇代表题目建议刷题量核心模板P0哈希表 双指针两数之和、三数之和12-15 题字典记录补数、左右指针收缩P0二叉树遍历中序遍历、层序遍历10-12 题递归三要素、队列 BFSP1滑动窗口无重复字符最长子串8-10 题左右指针 窗口内计数P1链表操作反转链表、环形链表8-10 题虚拟头节点、快慢指针P2动态规划爬楼梯、最长递增子序列15-20 题状态定义 转移方程P2回溯全排列、子集8-10 题选择 递归 撤销P3贪心 栈跳跃游戏、有效括号6-8 题局部最优 单调栈这个表不是绝对的但如果你时间有限按 P0 到 P3 的顺序刷至少能保证面试中遇到高频题不会完全没思路。2.2 周赛题和日常练习的配比怎么定力扣周赛比如最近讨论比较多的周赛 430是检验刷题效果的试金石但我不建议新手一上来就打周赛。周赛的题目节奏是第一题签到题第二题中等偏易第三题中等偏难第四题困难。如果你连 Hot 100 里的中等题都不能在 20 分钟内独立写出打周赛只会打击信心。我的做法是日常刷题和打周赛的比例控制在 4:1。也就是说刷完 40 道题左右去打一次周赛。打周赛的目的不是拿名次而是训练在时间压力下读题、拆解和编码的能力。打完周赛之后不管做出来几道都要把没做出来的题补掉并且写一篇简短的复盘笔记记录卡在哪一步。提示周赛复盘比周赛本身更重要。我见过很多人打完周赛对完答案就关了下次遇到同类题还是不会。复盘时要写清楚是题意理解错了还是算法没想到还是边界条件没处理好。3. 拆解力扣原题从读题到写出可提交代码的完整流程3.1 读题阶段把题目翻译成数据结构和操作力扣原题的题干通常包含三部分背景故事、输入输出描述、约束条件。很多人只读前两部分就动手结果在边界条件上反复翻车。我一般会按以下步骤读题第一步忽略背景故事直接看输入输出。比如「爱吃香蕉的狒狒」这道题LeetCode 875背景是狒狒吃香蕉但核心是给定一个数组 piles 和一个整数 h求最小的吃香蕉速度 k使得能在 h 小时内吃完所有香蕉。第二步把输入输出翻译成数据结构。piles 是整数数组h 是整数输出是整数 k。操作是每小时选一堆吃 k 根如果这堆不够 k 根就吃完为止。第三步看约束条件。piles 的长度范围、piles[i] 的范围、h 的范围。这些约束决定了你能用多大的时间复杂度和空间复杂度。比如如果 piles 长度是 10^4h 是 10^9那 O(n log n) 的二分查找是合适的O(n^2) 就会超时。第四步手动模拟一个小例子。用题目给的示例在纸上或者脑子里走一遍确认自己理解的操作流程和题目一致。3.2 手写阶段先写伪代码再翻译成目标语言读完题之后不要急着打开编辑器。我一般会先在纸上或者注释里写伪代码把核心逻辑用自然语言描述清楚。以「爱吃香蕉的狒狒」为例伪代码大概是这样二分查找速度 k范围从 1 到 max(piles) 对于每个 k计算吃完所有香蕉需要的小时数 如果小时数 h说明 k 可行尝试更小的 k 如果小时数 h说明 k 太小需要更大的 k伪代码写完之后再翻译成 Python。下面是我提交的代码import math def minEatingSpeed(piles, h): # 二分查找的左边界是 1右边界是最大堆的香蕉数 left, right 1, max(piles) while left right: mid (left right) // 2 # 计算以速度 mid 吃完所有香蕉需要的小时数 hours sum(math.ceil(p / mid) for p in piles) if hours h: # 当前速度可行尝试更小的速度 right mid else: # 当前速度太慢需要更大的速度 left mid 1 return left逻辑说明这道题的核心是二分查找的变体。我们不是在有序数组里找目标值而是在一个单调的可行性函数上找最小值。速度 k 越大需要的小时数越少这是一个单调递减的关系。所以可以用二分查找来逼近最小的可行 k。参数说明piles是整数数组表示每堆香蕉的数量h是整数表示限定的时间返回值是整数表示最小的吃香蕉速度。math.ceil(p / mid)计算的是吃完一堆香蕉需要的小时数因为每小时只能选一堆吃所以每堆至少需要 1 小时。3.3 验证阶段用边界用例和随机用例自测代码写完之后不要直接提交。力扣官网的提交按钮旁边有一个「运行」按钮可以先用题目给的示例测试。但示例通常太简单我一般会自己构造几组边界用例piles [1], h 1答案应该是 1piles [1000000000], h 2答案应该是 500000000piles [3, 6, 7, 11], h 8答案应该是 4piles [30, 11, 23, 4, 20], h 5答案应该是 30piles [30, 11, 23, 4, 20], h 6答案应该是 23这些用例覆盖了单元素、大数、刚好整除、不整除等情况。如果这些都能过再提交。提交之后如果报错力扣会给出失败的用例这时候要仔细看失败用例的输入和预期输出反推自己的逻辑哪里有问题。注意力扣的「运行」和「提交」用的是不同的测试集。「运行」只跑题目给的示例「提交」会跑全部测试用例。所以「运行」通过不代表「提交」能过一定要提交一次看看。4. 力扣刷题避坑那些年我踩过的 5 个血泪坑4.1 坑一只看题解不手写面试时大脑空白现象平时刷题都是看题解觉得思路懂了就过。面试时面试官出一道同类题明明见过但手写时卡在边界条件上最后没写完。原因看题解是「输入」过程手写是「输出」过程。输入和输出之间隔着一条鸿沟只有反复手写才能把题解的思路内化成自己的肌肉记忆。解决每道题看完题解之后关掉题解自己从头写一遍。写不出来就再看再看再写直到能独立写出 bug-free 的代码。这个过程很痛苦但效果最好。我一般会要求自己每道 Hot 100 的题至少手写三遍第一遍看题解后写第二遍隔一天写第三遍隔一周写。4.2 坑二不重视边界条件提交后反复 WA现象代码逻辑看起来没问题但提交后总是有几个测试用例过不了报 Wrong Answer。原因边界条件没考虑全。常见的边界包括空数组、单元素数组、所有元素相同、目标值在数组两端、整数溢出、负数、零等。解决写完代码后先不提交自己列一个边界条件清单逐个检查。我常用的清单是输入为空吗输入只有一个元素吗输入有重复元素吗结果可能溢出吗索引会越界吗循环会死循环吗把这些问题过一遍能避免大部分 WA。4.3 坑三死磕一道题超过一小时效率极低现象遇到一道难题想自己独立做出来结果卡了一个半小时最后还是看了题解。回头看这一个半小时里大部分时间是在原地打转。原因刷题的目的是学习解题套路不是证明自己聪明。在一道题上死磕太久既浪费时间又打击信心。解决给自己设一个时间上限比如 25 分钟。25 分钟内没思路就看题解。看完题解之后关掉题解自己写一遍。如果写不出来再看再写。这个时间上限可以根据题目难度调整简单题 15 分钟中等题 25 分钟困难题 40 分钟。4.4 坑四只刷一种语言换语言就废现象平时用 Python 刷题面试时公司要求用 Java 或者 C结果连基本的语法都要查更别说写算法了。原因不同语言的语法和标准库差异很大。Python 的列表操作和 Java 的 ArrayList 操作完全不同Python 的字典和 Java 的 HashMap 也不同。解决至少熟悉两种语言的刷题写法。我一般建议 Python Java或者 Python C。Python 用来快速验证思路Java 或 C 用来模拟面试环境。如果时间紧张至少要把目标公司的常用语言刷一遍 Hot 100。4.5 坑五不复盘刷完就忘现象刷了 200 道题但面试时遇到做过的题还是不会或者只能想起模糊的思路。原因没有复盘。刷题不是目的掌握解题套路才是。如果不复盘刷过的题就像流水一样过去了没有沉淀。解决每刷完一道题花 5 分钟写一个简短的复盘笔记。笔记内容包括这道题考什么题型核心思路是什么边界条件有哪些有没有更优解法我一般用 Notion 或者飞书文档记录按题型分类。过一段时间回头看会发现很多题的思路是相通的。5. 从力扣原题到面试手撕我的进阶训练方法5.1 用「白板模式」模拟面试环境力扣官网的编辑器有代码补全和语法高亮但面试时通常是在白板或者共享文档里手写代码没有补全没有高亮甚至没有缩进。所以我平时会刻意用「白板模式」训练打开一个纯文本编辑器关掉所有插件手写代码。写完之后再复制到力扣里运行看看能不能过。这个训练方法一开始很痛苦因为经常拼错变量名或者忘记缩进。但练多了之后手写代码的准确率会明显提高。我一般每周至少做两次白板训练每次选一道中等题限时 30 分钟。5.2 用「费曼技巧」讲题给自己听费曼技巧的核心是如果你不能用简单的语言把一件事讲清楚说明你还没真正理解它。刷题也一样。每做完一道题我会假装自己是面试官对着空气讲一遍这道题的解法题目要求是什么核心思路是什么为什么用这个数据结构时间复杂度是多少边界条件有哪些。讲的过程中如果卡壳了说明这个地方没理解透回去再看题解。这个方法的另一个好处是面试时如果面试官让你解释思路你能讲得清楚而不是只会写代码。5.3 用「错题本」追踪薄弱题型我维护了一个错题本记录每次做错的题和卡住的题。错题本不是简单抄题目而是记录这道题属于哪个题型我卡在哪一步正确思路是什么同类题还有哪些每隔两周我会把错题本翻一遍把里面的题重新做一遍。如果还是做不出来就标记为「重点薄弱」下次优先复习。这个习惯坚持了半年之后我发现自己卡住的题越来越集中在动态规划和图论上于是有针对性地加强了这两个题型的训练。5.4 用「限时训练」提升解题速度面试是有时间压力的通常一道中等题要在 20-25 分钟内完成读题、思考、编码和测试。所以我平时会做限时训练选一道没做过的中等题设定 25 分钟倒计时模拟面试节奏。时间到了之后不管有没有做完都停下来复盘是读题慢了还是思路卡了还是编码慢了限时训练的关键是记录每个阶段的时间分配。我一般会把 25 分钟拆成读题 3 分钟思考 5 分钟编码 12 分钟测试 5 分钟。如果某个阶段超时就分析原因下次调整。5.5 一个具体的训练计划模板如果你不知道每天该练什么可以参考我用的这个周计划模板日期训练内容时长目标周一刷 3 道 P0 题型新题90 分钟保持手感周二复习错题本 手写 2 道旧题60 分钟巩固薄弱周三刷 2 道 P1 题型新题 1 道困难题90 分钟拓展难度周四白板训练 1 道中等题30 分钟模拟面试周五刷 3 道 P2 题型新题90 分钟攻克弱项周六打周赛 复盘120 分钟实战检验周日休息或补刷本周未完成的题灵活查漏补缺这个计划不是死的可以根据自己的进度调整。关键是保持每天都有输入和输出不要只输入不输出。最后说一个我自己的习惯每次面试前一周我会把 Hot 100 里最常考的 20 道题手写一遍不看题解限时完成。这个习惯帮我稳住了好几次面试的手感。刷力扣原题没有捷径但有方法。希望帮到你。本文还有配套的精品资源点击获取
返回列表