LeetCode 从 0 到 200 学到了什么

3,668 阅读11分钟

公众号:ByteCode,致力于分享最新技术原创文章,涉及 Kotlin、Jetpack、译文、系统源码、 LeetCode / 剑指 Offer / 多线程 / 国内外大厂算法题 等等一系列文章。

LeetCode 不知不觉刷了 210 题,总提交次数 1069 次,想写一篇文章,跟大家聊聊 LeetCode 刷题感受以及经验,主要包含以下内容。

  • LeetCode 刷题历程?
  • 为什么刷题?
  • 刷题真的能找到工作吗?
  • 如何刷题?

平时除了刷 LeetCode,同时也会做 Daily Coding Problem 上面的题目,Daily Coding Problem 包含了很多国外大厂(Google、FaceBook、Uber、Amazon 等等)的算法题,我也在刷题过程中梳理了一些题目和题解,为了方便查看,我用 docsify 工具整理了这些题解。其中包含了 LeetCode / 剑指 Offer / 多线程 / 国内外大厂算法题,后期我会用图解算法的方式,重写这些内容。

刷题历程

数据结构和算法现在已经是每个程序员必须掌握的基础技能之一了,也是面试的入门门槛之一,无论是外企,还是国内的企业,算法已经成为了必问的问题,我相信有很多朋友跟我一样刚开始刷 LeetCode 都是为了面试做准备。

我第一次刷 LeetCode 是在 3 年前,如下图所示,这是我第一次的提交记录

当时我使用的国际版,主要有两个目的,其一是学习英语,其二是为了面试做准备,所以断断续续的开始刷题。

2020 年开始从国际版切换到国内版,因为国内版本做的越来越好了,题库也更加完善,除了基本的算法、数据库、Shell、多线程之外,还有程序员面试宝典、剑指 offer 等等系列题目。而且还有一个选项 「题目以中文显示」或者「题目以英文显示」,完全满足我个人在刷题过程中同时也可以学习英语需求。以下图所示是我 2020 年 LeetCode 上的年度报告。

Google 这几年一直在强力推荐 Kotlin,自从用了 Kotlin 了之后爱不释手,工作效率提高了很多,所以我在刷 LeetCode 会分别使用 Java、Kotlin 两种语言,目前我也在重拾 C 语言。

2020 年是我突飞猛进的一年,也是我刷题最多的一年,以下是我 2020 年 LeetCode 年度报告的提交记录。

LeetCode 年度报告功能真的很棒,不知不觉中 2020 年居然提交了 700 次,在这一年基本每周都会刷 1 ~ 3 题,每隔一段时间,会把之前刷过的题目在重新刷一遍。我做题的速度比较慢,重在掌握每一个知识点,LeetCode 上做的快的大半年能刷 400+、700+ 题目,可能它们的基础算法能力很强,所以刷题很快吧。

为什么刷题

我最开始刷 LeetCode 和很多朋友一样都是为了面试做准备,因为有一次出去面试,我并没有准备任何算法,因为在大学的时候参加过一些算法类竞赛,还是有点算法基础的,所以我认为对于 Android 开发来说,算法不会很难,结果那次挂了。

自从那次经历之后就开始刷题了,等面试通过之后就断掉,中间偶尔会也会刷刷题,让我持续不断的刷题,意识到算法的重要性,是因为有次在做一个功能优化的时候,突然发现可以用之前刷过的一道算法题来提升它运行速度。

从那个时候我就意识到了算法的重要性,我们通常在开发一个功能的时候,因为时间短的原因,没有多余的时间去思考,很多地方都是暴利解法,先把功能先实现了,当开始做性能优化的时候,这部分功能,可以用高效的算法和数据结构去解决,从而提升它的运行速度。

因此从 2020 年开始持续不断的刷题,不在是为了面试而刷题,而是意识到它的重要性,一边刷题一边梳理知识点,然后不断重复的刷之前做过的题,当你在刷题的时候想到解法和官方最优解法相同的时候,心里有一种不言而喻的成就感,慢慢的不知不觉的就爱上了刷题,截止到现在为止我已经刷了 210 题,总提交次数 1069 次。

刷题真的能找到工作吗

如果是国外的企业它们注重点在算法上,所以算法好能提高自己的通过率,但是对于国内企业,算法好不一定能通过,除了考察算法能力之外,还有专业的基础知识、系统源码、开源库的源码、数据结构设计、网络知识、做过的项目相关的知识等等。算法难度大部分都在 Medium,我也遇到过几个 Hard。总之一句话国内企业招人,要招全才,方方面面不仅要会而且还要知道其原理。

分享一下我印象中遇到过的算法题:

  • 最长不含重复字符的子字符串
  • 直线上最多的点数
  • K 个一组翻转链表
  • 最长回文子串
  • 柱状图中最大的矩形
  • 数组中的第K个最大元素
  • 多线程:实现奇数和偶数顺序打印
  • 复杂链表的复制
  • 调整数组顺序使奇数位于偶数前面,且保持相对顺序不变
  • 从含有重复数字的排序数组中输出重复数字的下标
  • 扑克牌中的顺子
  • 圆圈中最后剩下的数字
  • 二叉树中和为某一值的路径
  • 反转从位置 left 到位置 right 的链表节点
  • 删除链表的倒数第 N 个结点
  • 仅含 1 的子串数
  • 二叉树最长路径
  • 实现生产者在和消费者
  • 最少移动次数使数组元素相等
  • 从数组中找出两个出现一次的数,其他数出现了两次
  • ......

如何刷题

我刚开始刷题的时候也遇到过这个问题,LeetCode 题库非常庞大,如何开始刷题,正在我比较疑惑的时候,看到 K 神的经验心得 扬帆,起航,我猜刷过题的朋友 95% 的小伙们都应该看过 K 神的题解,在这里感谢 K 神的付出。

正因为 K 神分享的这篇文章,让我开始刷 「剑指 Offer」 系列题目,目前已经用 Java 语言将 「剑指 Offer」系列题目全部刷了一遍,现在我正打算使用其他语言在刷一遍,同时也会将题目和题解整理起来,后续会持续分享。「剑指 Offer」 部分截图如下所示。

如果对 数组、字符串、栈、队列、链表、树、深度优先遍历、广度优先遍历、查找算法等等比较了解的朋友,可以直接刷 「剑指 Offer」系列题目。

但是如果你对上述算法不是很了解,建议先从 「LeeeCode 首页」-> 「导航条:学习」-> 「筛选 常用数据结构」 开始学起,如下图所示。

里面的题目都是一些基础题,LeetCode 上还有很多数据结构的电子书,小伙伴们可以从中找自己想学习的内容,一点一点的开始学习,日积月累,刷题不在于你刷多少题,而在于你是否掌握每一个知识点。恰恰这些基础知识点,在实际项目中、源码中都非常的常见,强烈建议一定要掌握。

当你对 数组、字符串、栈、队列、链表、树、深度优先遍历、广度优先遍历、查找算法等等都很了解了,就可以开始刷 「剑指 Offer」系列题目。

如果「剑指 Offer」刷完之后,就可以开始做「设计」相关的题目,可以从「标签分类」 中找到 「设计」的标签, 查看所有和 「设计」 相关的题目。

设计这个标签里,梳理了实际问题的场景,需要我们用已经学习过的数据结构组装成一个新的,适用于当前问题场景的数据结构。例如 LRU 缓存机制、设计链表(单链表、双向链表)、设计循环队列 等等。

当基础的算法掌握之后,不要只刷一种类型的题目,不同类型的题目互相刷,例如做几道 「设计」 相关的题目, 然后可以切换到做「多线程」 相关的题目或者其他类型题目。以下是我刷 「多线程」相关的题目截图。

总结

现在 LeetCode 平台资源越来越完善了,包含了 设计模式、算法、数据结构、多线程、程序设计等等很多资源,已经成为了我每天必登陆的一个网站,但是 LeetCode 题库非常庞大,每个分类都能筛选出很多题目,我结合着网友的分享和自己刷题过程中的总结,按照算法及数据结构的类型去分类,如下图所示,小伙伴们可以按照我的分类,前期列出自己的计划按照每个知识点去刷题,在这个过程中不断总结和回顾找到一个适合自己的方式。

LeetCode 不仅助力了很多人拿到了大厂的 Offer,同时也学习到了很多国内外大神的思路,而且还可以和很多同学一起探讨,也有很多非常有意思的评论,让刷题的过程变得不在那么枯燥,LeetCode 见证了我们成长的步伐。当你经历了无数个枯燥泛味的夜晚,最终会收获自己想要的结果。希望本文能给小伙伴们带来一些帮助。


全文到这里就结束了,如果有帮助 点个赞 就是对我最大的鼓励

代码不止,文章不停

欢迎关注公众号:ByteCode,持续分享最新的技术



最后推荐我一直在更新维护的项目和网站:

  • 全新系列视频:现代 Android 开发 (MAD) 技巧系列教程:在线查看

  • 计划建立一个最全、最新的 AndroidX Jetpack 相关组件的实战项目 以及 相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看:AndroidX-Jetpack-Practice

  • LeetCode / 剑指 offer / 国内外大厂面试题 / 多线程 题解,语言 Java 和 kotlin,包含多种解法、解题思路、时间复杂度、空间复杂度分析

  • 最新 Android 10 源码分析系列文章,了解系统源码,不仅有助于分析问题,在面试过程中,对我们也是非常有帮助的,仓库持续更新,欢迎前去查看 Android10-Source-Analysis

  • 整理和翻译一系列精选国外的技术文章,每篇文章都会有译者思考部分,对原文的更加深入的解读,仓库持续更新,欢迎前去查看 Technical-Article-Translation

  • 「为互联网人而设计,国内国外名站导航」涵括新闻、体育、生活、娱乐、设计、产品、运营、前端开发、Android 开发等等网址,欢迎前去查看 为互联网人而设计导航网站

历史文章