LeetCode 从 0 到 200 学到了什么
这是 dhl 的第 32 篇原创文章
LeetCode 不知不觉刷了 210 题,总提交次数 1069 次,想写一篇文章,跟大家聊聊 LeetCode 刷题感受以及经验,主要包含以下内容。
LeetCode 刷题历程? 为什么刷题? 刷题真的能找到工作吗? 如何刷题?
平时除了刷 LeetCode,同时也会做 Daily Coding Problem 上面的题目,Daily Coding Problem 包含了很多国外大厂(Google、FaceBook、Uber、Amazon 等等)的算法题,我也在刷题过程中梳理了一些题目和题解,为了方便查看,我用 docsify 工具整理了这些题解。其中包含了 LeetCode / 剑指 Offer / 多线程 / 国内外大厂算法题,后期我会用图解算法的方式,重写这些内容。
剑指 Offer 及国内外大厂面试题解:
在线阅读: https://offer.hi-dhl.comLeetCode 系列题解:
在线阅读: https://leetcode.hi-dhl.com
刷题历程
数据结构和算法现在已经是每个程序员必须掌握的基础技能之一了,也是面试的入门门槛之一,无论是外企,还是国内的企业,算法已经成为了必问的问题,我相信有很多朋友跟我一样刚开始刷 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 神的付出。
https://leetcode-cn.com/circle/article/kQcYo2/?um_chnnl=xiaomi?um_from_appkey=5fcda41c42348b56d6f8e8d5
正因为 K 神分享的这篇文章,让我开始刷 「剑指 Offer」 系列题目,目前已经用 Java 语言将 「剑指 Offer」系列题目全部刷了一遍,现在我正打算使用其他语言在刷一遍,同时也会将题目和题解整理起来,后续会持续分享。「剑指 Offer」 部分截图如下所示。
如果对 数组、字符串、栈、队列、链表、树、深度优先遍历、广度优先遍历、查找算法等等比较了解的朋友,可以直接刷 「剑指 Offer」系列题目。
但是如果你对上述算法不是很了解,建议先从 「LeeeCode 首页」-> 「导航条:学习」-> 「筛选 常用数据结构」 开始学起,如下图所示。
里面的题目都是一些基础题,LeetCode 上还有很多数据结构的电子书,小伙伴们可以从中找自己想学习的内容,一点一点的开始学习,日积月累,刷题不在于你刷多少题,而在于你是否掌握每一个知识点。恰恰这些基础知识点,在实际项目中、源码中都非常的常见,强烈建议一定要掌握。
当你对 数组、字符串、栈、队列、链表、树、深度优先遍历、广度优先遍历、查找算法等等都很了解了,就可以开始刷 「剑指 Offer」系列题目。
如果「剑指 Offer」刷完之后,就可以开始做「设计」相关的题目,可以从「标签分类」 中找到 「设计」的标签, 查看所有和 「设计」 相关的题目。
设计这个标签里,梳理了实际问题的场景,需要我们用已经学习过的数据结构组装成一个新的,适用于当前问题场景的数据结构。例如 LRU 缓存机制、设计链表(单链表、双向链表)、设计循环队列 等等。
当基础的算法掌握之后,不要只刷一种类型的题目,不同类型的题目互相刷,例如做几道 「设计」 相关的题目, 然后可以切换到做「多线程」 相关的题目或者其他类型题目。以下是我刷 「多线程」相关的题目截图。
总结
现在 LeetCode 平台资源越来越完善了,包含了 设计模式、算法、数据结构、多线程、程序设计等等很多资源,已经成为了我每天必登陆的一个网站,但是 LeetCode 题库非常庞大,每个分类都能筛选出很多题目,我结合着网友的分享和自己刷题过程中的总结,按照算法及数据结构的类型去分类,如下图所示,小伙伴们可以按照我的分类,前期列出自己的计划按照每个知识点去刷题,在这个过程中不断总结和回顾找到一个适合自己的方式。
剑指 Offer 及国内外大厂面试题解:
在线阅读: https://offer.hi-dhl.comLeetCode 系列题解:
在线阅读: https://leetcode.hi-dhl.com
LeetCode 不仅助力了很多人拿到了大厂的 Offer,同时也学习到了很多国内外大神的思路,而且还可以和很多同学一起探讨,也有很多非常有意思的评论,让刷题的过程变得不在那么枯燥,LeetCode 见证了我们成长的步伐。当你经历了无数个枯燥泛味的夜晚,最终会收获自己想要的结果。希望本文能给小伙伴们带来一些帮助。
全文到这里就结束了,如果有帮助欢迎 在看 、点赞 、分享 就是对我最大的鼓励
代码不止,文章不停
欢迎点击下方卡片关注我,持续分享最新的技术
推荐阅读:
最后推荐我一直在更新维护的项目和网站:
全新系列视频:现代 Android 开发 (MAD) 技巧系列教程
https://madskills.hi-dhl.com最新的 AndroidX Jetpack 相关组件的实战项目 以及 原理分析的文章
https://github.com/hi-dhl/AndroidX-Jetpack-PracticeLeetCode / 剑指 offer / 国内外大厂面试题 / 多线程 题解,语言 Java 和 kotlin,包含多种解法、解题思路、时间复杂度、空间复杂度分析
剑指 offer:https://offer.hi-dhl.com
LeetCode:https://leetcode.hi-dhl.com最新 Android 10 源码分析系列文章
https://github.com/hi-dhl/Android10-Source-Analysis一系列国外的技术文章,每篇文章都会有译者思考部分,对原文的更加深入的分析
https://github.com/hi-dhl/Technical-Article-Translation「为互联网人而设计,国内国外名站导航」涵括新闻、体育、生活、娱乐、设计、产品、运营、前端开发、Android 开发等等网址
https://site.51git.cn