力扣 (LeetCode) 是定位为求职的做题网站,题库以算法题为主。LeetCode 的题目数量众多,而且在持续增加新题。
除了题库以外,LeetCode 还有学习、讨论、竞赛、求职、在线面试等功能。
LeetCode 的题库以算法题为主。除了算法题以外,还有数据库、脚本和多线程的题目,以及 2020 年新上线的《剑指 Offer》和《程序员面试金典》授权的题目。
LeetCode 的题库中的题目难度分为三类,从低到高依次是简单、中等、困难。大多数题目的难度评定是比较准确的,但是有少数题目的难度评定不够准确,《剑指 Offer》和《程序员面试金典》授权的题目中,有较多的题目的难度评定是不准确的,因此难度仅供参考。
个人认为,LeetCode 的题目难度分为三类的粒度不够细,可以在每一类难度下进一步划分难度,因此笔者将题目难度细分成了 11 个等级,11 个等级与三大类难度的对应关系如下:
其中,11 级表示超出求职要求的难度,因此,11 级的题目是很少的。
细分的等级与 LeetCode 的三大类难度不一定完全对应,而是根据题目内容和复杂度要求决定。
LeetCode 的题库有标签功能,标签只对算法题适用,包括主站的算法题和两本书上的算法题,以及多线程有一道题目和搜索相关因此也有标签。
每个标签都关联特定的数据结构和算法的知识点,可以根据标签筛选特定知识点的题目。
在 LeetCode 的编辑器里写好代码之后,可以在控制台自定义测试用例,然后执行代码,根据特定的测试用例检验代码的正确性。
除了执行代码之外,也可以提交代码,提交代码之后会使用全部的测试用例测试代码的正确性。
提交结果显示「通过」表示代码实现正确,且时间复杂度和空间复杂度都符合题目要求。除了「通过」以外,提交结果还可能有其他情况,列举如下。
其中,「解答错误」、「超出时间限制」和「超出内存限制」三种情况都会显示没有通过的测试用例(如果全部测试用例的总用时超出时间限制,则不会显示没有通过的测试用例)。
由此可见,要通过一道题,不只是运行结果正确就可以,还要满足题目限定的时间复杂度和空间复杂度要求。一般而言,时间比空间更重要,因此应该优先考虑降低时间复杂度。
每道题目都有评论区和题解区。评论区包括用户对题目的评论以及部分代码,题解区包括官方题解和用户写的题解。
题解区的题解质量高低不一,因此应该学习优质的题解。一般而言,官方题解(由「力扣官方题解」发布)、精选题解和排名靠前的题解都是优质的题解,是值得学习的。一道题目可能有多种解法,多看题解,也可以学到不同的解法。
学习功能即为 LeetBook。LeetBook 的内容颇为丰富,以数据结构和算法为主,另外还有编程语言知识点整理、专业基础知识、设计模式、机器学习等方面的内容。
LeetCode 的讨论区包括求职面试、职场与内推、技术交流、文章分享、意见反馈五大板块。
在讨论区可以发布和参与讨论,在职场和技术等多个方面有所收获。也可以撰写文章。
讨论区支持收藏功能,可以对感兴趣的讨论和文章收藏,方便以后回顾。
LeetCode 定期举办竞赛,竞赛分成两种,第一种是周赛和双周赛,第二种是季赛。竞赛根据选手的得分和用时排名,排名靠前者有积分奖励和实物奖励。
LeetCode 对竞赛的公平性非常重视,对于作弊行为是严格禁止的。一旦发现作弊行为,作弊者将面临积分清零和封禁帐号的处罚。
LeetCode 定期举办竞赛,每周日举办一次周赛,每两周的周六举办一次双周赛。
周赛和双周赛的比赛时长是 90 分钟,包括 4 道题,每道题的难度和分值各不相同。比赛过程中可以按照任意顺序做题。
竞赛过程中,一道题目正确提交之后即为通过,得到这道题目的分值。如果提交错误,则会显示错误原因和结果错误的测试用例,需要根据错误原因排查错误,然后重新提交。有部分测试用例是隐藏的,如果结果错误的测试用例是隐藏测试用例,则只会显示错误原因,不会显示测试用例。
竞赛的排名依据是:首先根据选手的得分降序排序,在选手的得分相同的情况下,根据选手的用时升序排序。只有正确提交的题目才会考虑用时,对于正确提交的题目,在第一次正确提交之前的每一次错误提交都会产生 5 分钟的罚时。
LeetCode 的季赛为每年两次,包括春季赛和秋季赛,时间分别是每年的 4 月和 9 月。
每次季赛分为两场,个人赛和战队赛。个人赛要求选手独立完成,比赛时长是 150 分钟,包括 5 道题;战队赛要求选手组队完成,每个战队的人数限制为 1 人到 3 人,比赛时长是 180 分钟,包括 6 道题。每道题有不同的难度和分值。
季赛的规则与周赛和双周赛大致相同,不同之处是,季赛的错误提交都只会显示错误原因,不会显示结果错误的测试用例。
求职页面可以搜索企业的面试题库和招聘信息,此外还可以模拟面试。
模拟面试有随机模拟面试、自定义选题模拟面试和企业题库模拟面试三种。
模拟面试的实质是机试,在限定时间内完成题目。
在线面试为真人面试。面试官需要创建面试,选定题目,将链接分享给面试者,面试者进入链接之后即可开始在线面试。
面试官选题时,可以添加 LeetCode 题、白板题和前端题。面试时可以使用音视频通话,面试官和面试者都可以对代码进行编辑。面试时可以自动判题,更客观地评价面试者的表现。
在线面试功能可以用于实际的面试,也可以用于真人模拟面试。