为什么要刷LeetCode
大家都知道,很多对算法要求高一点的软件公司,比如美国的FLAGM (Facebook、LinkedIn、Amazon/Apple、Google、Microsoft),或国内大厂BAT、TMD、华为,以及国内新兴的 AI 公司等等,都对算法水平有所要求。据悉知名游戏公司的算法岗收入很高,相应的对算法要求也比较高。而这些公司,大多数会以 LeetCode 中的题目或基于 LeetCode 改进后的自家算法题库来考察候选人。
于是想进入上述大厂,定期做 LeetCode 题目很有必要。即使没打算进这些大厂,坚持做LeetCode,个人的算法水平、编程能力也会有较大提升。本文主要介绍 .NET 开发者如何入手刷 LeetCode 面试题。
提升抽象思维水平
计算机中有很多抽象的数据结构,比如: List、Stack(栈)、Linked List(链表)、Hash Table(哈希表)、Heap(堆)、Tree等等,而LeetCode 上的大量高质量算法题基本上涵盖了所有这些数据结构的应用。怎么将这些题抽象成数学模型,转化为具体数据结构的应用,则是我们需要提升的地方,而这恰恰帮我们极大地提升了自己的抽象思维水平。
时刻对时间、空间复杂度有所掌控
每一个算法实现都有其相应的时间复杂度和空间复杂度,而 LeetCode中的一些题对时间复杂度有明确要求,有的要求O(n)即可,有的则要求O(1)才行,否则代码无法 AC(Accepted)。
对各个语言有更深的理解
比如你上学时用 C++ 刷一遍,工作后再用 C# 刷一遍,最后再用 Python 刷一遍,那么你对各个语言的代码量和性能都会有更深地体会,也会知道用哪一种语言具体该怎么写出更简短、更优雅的代码。
中学有NOI信息竞赛,大学有ACM算法竞赛,按理说应该都有各自的 OJ,这两类 OJ 不是业内公司的真实面试题。NOI了解的不是特别多,据说以前用 Pascal 语言解题。相应地,我知道有个中学生比较多的 OJ 叫洛谷(https://www.luogu.org/)。而ACM有不少免费 OJ,国内就有一些ACM OJ,比如POJ(北大的)、HDU OJ(杭电的)、ZOJ(浙大的)、HUST OJ(华科的)。另外,还有些职场用的OJ,比如牛客网OJ、浙江大学计算机程序设计能力考试 PTA(拼题A,原全称为Programming Ability Test,简称PAT) 等等。
而国外有 UVAoj ,TopCoder ()等等,另外还记得微软的校招笔试用的 OJ 是 hihoCoder 。
而 LeetCode 较上述 OJ 而言有如下优势:
题基本上都来自于业内大公司的真实面试题
题目不是竞赛性质,难度也适中
支持多种主流编程语言C++/C/C#/Python/Java/js/Ruby/PHP/Kotlin等
不用处理输入输出问题,可以集中精力解决具体问题
提供Discuss环境,可参考他人代码
提供执行用时分布图表,可看到自己提交的代码在所有已AC代码中的运行效率排名
传统的 OJ 对用户代码的判定状态有如下几种:
1、Accepted. ——通过!(AC)
2、Wrong Answer.——答案错。(WA)
3、RunTime Error.——程序运行出错,意外终止等。(RTE)
4、Time Limit Exceeded. ——超时。程序没在规定时间内出答案。(TLE)
5、Presentation Error. ——格式错。程序没按规定的格式输出答案。(PE)
6、Memory Limit Exceeded. ——超内存。程序没在规定空间内出答案。(MLE)
7、Compile Error. ——编译错。程序编译不过。(CE)
而在 LeetCode 中,应该是没有第5种状态的。
刷 OJ 时,大家还会常用两个词:
AK(ALL KILL),把比赛中所有题都做出来了,出题方需要考虑防AK策略。
1Y: 第一次提交就正确了,也就是大家常说的“一遍过“
刷题时大家的一致感觉是: AC一时爽,一直AC一直爽!
在本文开头,我们提到了很多行内名厂需要考察与 LeetCode 难度难度相当的算法题。但需要注意的是,面试时很可能面试官会对题目的解题要求进行另外的调整,比如要求更低的时间复杂度、更低的空间复杂度之类的,所以呢,面试算法题很重要的是要和面试官保持即时的沟通,而不是一上来就埋头写代码。
有的人刷 LeetCode 中 Easy 和 Medium的题3遍左右后成功拿到微软Offer,还是Special Offer!也有人刷完LeetCode很多遍,也没能拿到大厂Offer呢。
更多算法题面试要点请参看一亩三分地论坛站长Warald 的文章 Leetcode刷题五遍还没offer!举例分析为什么找工作光刷题不够 .
在 LeetCode 中提交 C# 代码有两种主流方式,下面以 LeetCode 中的136号题为例来说明。
该题的中文版网址为: https://leetcode-cn.com/problems/single-number/,将代码语言选为C#,则默认的接口代码如下: