LeetCode刷题攻略

目录

一、LeetCode简介

二、刷leetcode的主要目的

三、常用的数据结构

四、常用的算法思想

五、选择算法题

1、刷题选择

2、刷题方法

方法一:顺序法

方法二:标签法

方法三:随机法

方法四:必杀法

六、刷题攻略

TIP 1:

TIP 2:

TIP 3:

TIP 4:


 

 

应届生面试算法就考个数组 链表 二叉树 矩阵 数组变着法子考你排序 查询 指针 位运算 链表变着法子考你指针 最多再考个哈希 二叉树变着法子考用递归和栈前中后遍历 最多加上回溯 矩阵的话就是知道起点的路径查询和不知道起点的路径查询 掌握了这些面大厂就比较轻松了,其实和学历技术关系也不大 大部分人先死在了想都不敢想上。

一、LeetCode简介

据了解,LeetCode 是一个非常棒的 OJ(Online Judge)平台,收集了许多公司的面试题目。相对其他 OJ 平台而言,有着下面的几个优点:

  • 题目全部来自业内大公司的真实面试
  • 不用处理输入输出,精力全放在解决具体问题上
  • 题目有丰富的讨论,可以参考别人的思路
  • 精确了解自己代码在所有提交代码中运行效率的排名
  • 支持多种主流语言:C/C++,Python, Java
  • 可以在线进行测试,方便调试

二、刷leetcode的主要目的

  • 熟悉各互联网公司的算法题目,为找工作做准备。
  • 复习以前学过的编程语言,LeetCode支持几乎所有主流编程语言,大家可以用不同语言来做题。
  • 熟悉常见的算法和数据结构,LeetCode提供了交流平台,一些大神会将自己的解法贴出来共享,有些巧妙的解法实在令人叫绝。
  • 学习别人的编程思维,加快编程的速度,避免常见的BUG。

  另外LeetCode的题型都非常简单明了,并不需要的复杂的理解,一般都在50行以内就可以解决了,如果你写了上百行代码,就肯定说明你想太多了或太复杂,虽然都能用很短的代码就能解决,但并不意味着LeetCode的题目非常简单,实际上LeetCode基本上涉及到了所有常规的算法类型。

  刷 LeetCode 的最大好处就是可以锻炼解决问题的思维能力,相信我,如何去思考本身也是一个需要不断学习和练习的技能。此外,大量高质量的题目可以加深我们对计算机科学中经典数据结构的深刻理解,从而可以快速用合适的数据结构去解决现实中的问题。我们看到很多ACM大牛,拿到题目后立即就能想出解法,大概就是因为他们对于各种数据结构有着深刻的认识吧。

 

三、常用的数据结构

  • Stack:简单来说具有后进先出的特性,具体应用起来也是妙不可言,可以看看题目 32. Longest Valid Parentheses。
  • Linked List:链表可以快速地插入、删除,但是查找比较费时(具体操作链表时结合图会简单很多,此外要注意空节点)。通常链表的相关问题可以用双指针巧妙的解决,160. Intersection of Two Linked Lists 可以帮我们重新审视链表的操作。
  • Hash Table:利用 Hash 函数来将数据映射到固定的一块区域,方便 O(1) 时间内读取以及修改。37. Sudoku Solver 数独是一个经典的回溯问题,配合 HashTable 的话,运行时间将大幅减少。
  • Tree:树在计算机学科的应用十分广泛,常用的有二叉搜索树,红黑书,B+树等。树的建立,遍历,删除相对来说比较复杂,通常会用到递归的思路,113. Path Sum II 是一个不错的开胃菜。
  • Heap:特殊的完全二叉树,“等级森严”,可以用 O(nlogn) 的时间复杂度来进行排序,可以用 O(nlogk) 的时间复杂度找出 n 个数中的最大(小)k个,具体可以看看 347. Top K Frequent Elements。

四、常用的算法思想

  除了数据结构,具体算法在一个程序中也是十分重要的,而算法效率的度量则是时间复杂度和空间复杂度。对于一道编程问题,选用不同的数据结构和算法会得到不同的实现方式,比如“最长公共子串”。所以光能写出问题的实现还不够,还需要知道怎么针对问题设计算法,然后分析算法的复杂度来比较不同实现直接的优缺点。因此刷题之外,还需要记住每种算法实现的时间复杂度和空间复杂度。最常用的是Big O notation。一般情况下,人们更关注时间复杂度,往往希望找到比 O( n^2 ) 快的算法,在数据量比较大的情况下,算法时间复杂度最好是O(logn)或者O(n)。计算机学科中经典的算法思想就那么多,LeetCode 上面的题目涵盖了其中大部分,下面大致来看下。

 

  • 分而治之:有点类似“大事化小、小事化了”的思想,经典的归并排序和快速排序都用到这种思想,可以看看 Search a 2D Matrix II 来理解这种思想。
  • 动态规划:有点类似数学中的归纳总结法,找出状态转移方程,然后逐步求解。 309. Best Time to Buy and Sell Stock with Cooldown 是理解动态规划的一个不错的例子。
  • 贪心算法:有时候只顾局部利益,最终也会有最好的全局收益。122. Best Time to Buy and Sell Stock II 看看该如何“贪心”。
  • 搜索算法(深度优先,广度优先,二分搜索):在有限的解空间中找出满足条件的解,深度和广度通常比较费时间,二分搜索每次可以将问题规模缩小一半,所以比较高效。
  • 回溯:不断地去试错,同时要注意回头是岸,走不通就换条路,最终也能找到解决问题方法或者知道问题无解,可以看看 131. Palindrome Partitioning。

  当然,还有一部分问题可能需要一些数学知识去解决,或者是需要一些位运算的技巧去快速解决。总之,我们希望找到时间复杂度低的解决方法。为了达到这个目的,我们可能需要在一个解题方法中融合多种思想

———————————————————————————————————————————

 

五、选择算法题

点开Algorithms后,我们可以看到一列题目的列表,每个题目都有独一无二序号,后面的接受率(Acceptance)表示提交的正确率,Difficulty表示难易程度。

LeetCode按难易程度分成了:Hard、Medium、Easy三个级别。

  • Easy级别一般并不需要太多思考就可以想到算法,甚至可以通过直接的方式,特别适合新手去熟悉编程语言。
  • Medium级别就会有些难度,一般都会涉及到经典的算法,需要一定的思考。
  • Hard级别是最难的,有些时候是算法本身的难度,有些时候特别需要你考虑到各种细节。

 

1、刷题选择

盲目刷题不可取,因此,刷题要一定要搞清楚刷题的目的和原因。其实无外乎4种:

  • 如果想提升自己的思维能力,可以按照AC率(Accepted)由低到高二分查找匹配自己当前水平难度的题目,然后适当挑战高难度题(二分时间复杂度是O(logn),至少比从易到难的O(n)节省时间)
  • 如果想巩固某一专题,那自然应该按照tag来刷题,但是因为所用的方法在求解前已知,不太利于思维能力的提升
  • 如果什么都不懂,那么建议随机刷题,一来可以涨见识,二来进步空间比较大
  • 如果想提高AC率或者增加自信,那么建议刷水题

人与人之间还是有天赋差别的,但区别在于经验可以慢慢积累、再有个建议,题目如果太难超过当前自己能力的话,尝试一定时间后还是老老实实看题解吧

 

2、刷题方法

方法一:顺序法

建议未刷过题的新人按着顺序(AC)来,前 150 题覆盖了很多经典题目和知识点,指针法类如『3 sum』系列,动规类如『regex matching』,搜索类题目如『Sodoku Solver』。

基本熟悉知识点(图、树、堆、栈、链表、哈希表、记忆搜索、动态规划、指针法、并查集等)后,可以一类类标签强攻。Leetcode 右侧的标签系统虽然未必 100% 完整,但是大致分类做得还不错。

面试前的一个月可以只做『Hard』标签的题目,因为一般两遍之后对于大部分『Medium』难度以下的题目都是肌肉记忆了。多练习『Hard』类题目可以让自己的思路更开阔,因为很多题目使用的奇淫巧技让人惊讶,比如 Leetcode 精心设计连续题号的『84. Largest Rectangle in Histogram』、『85. Maximal Rectangle』。

方法二:标签法

按照网站给大家排列的不同tags,起到模块化的复习和学习作用。举个例子:比如复习链表的内容,就选Linked List这部分的23个题目。刷完之后可以再总结一下常用的方法和数据结构与构造方式。请不要为了刷题而刷题,一定是为了弥补一部分的知识去做。

 

方法三:随机法

随心所欲的选择难度与刷题顺序,哪个顺眼做哪个。本方法只适合业余编程,不从事本行业的同学以及大神级人物

 

方法四:必杀法

leetcode是有公司题库的,一句话:面哪家,刷哪家

 

六、刷题攻略

 

TIP 1:

众所周知,上古时期号称刷完leetcode所有题的大神,只不过是因为当时只有150道。而截至2018年1月,leetcode已经有700道题,且部分难度不小。要全部刷完,除了浪费你自己的时间,似乎找不到别的目的。

因此,对于大多数人来说,没有时间也没有必要把所有题目都做一遍(时间充裕可以随意)。可以考虑序号为前250位的题目,因为那些全是经典与必考题。

TIP 2:

善用收藏夹,要养成『一道题第二次练习尚不能解就加入收藏夹』的习惯,且需要定期清空收藏夹:每道题不需提示下通过两次后才能移出收藏夹。只想要答案的话很容易,题目评论区五花八门的答案,动不动就秀 python 一行代码解决,有那么多人点赞。问题是,你去做算法题,是去学习编程语言的奇技淫巧的,还是学习算法思维的呢?你的快乐,到底源自复制别人的一行代码通过测试,已完成题目 +1,还是源自自己通过逻辑推理和算法框架不看答案写出解法?经典题目不是刷一遍就完事的,要刷很多遍,因为大家在刷某个专题的时候,一定会忘一些之前的知识,例如刷到了贪心,可能回溯就已经有点想不起来了。所以一定要多刷,加深记忆,然后面试之前一段时间就开始看各个专题的总结篇,进行快速回顾。

TIP 3:

可以按照下文的面试出题频率顺序来做,从频率最高的一批开始。 而且请尽量不使用IDE,直接在平台上写代码。 

面试前可以购买会员,按照公司的标签来练习,也可以结合白板练习。面试前如果时间紧迫,那么练习的优先级分别是:即将面试公司的题目、收藏夹里的旧题目、剩余的新题。

冲刺阶段的练习请尽量不要打开题型标签,给自己思考的空间。如果真的刷了三遍以上还没法达到理想目标,那么一定是学习方法出了问题,请多总结。

TIP 4:

写好代码先不要提交,人工检查一下代码,比如分号是否都有写,return有没少等。 人工检查完后使用“Custom Testcase”功能自定义测试用例,注意检查边界,然后“Run Code”,这步可以发现蛮多问题的。  等RunCode通过后,再去提交。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLserver数据库反编译生成Hibernate实体类和映射文件

一、建立项目和sqlserver数据库 eclipse,我使用的版本是neon3 二、Data Source Explorer 选择OK 在data source Explorer的Database Connections 选择New 填写好General的连接信息 新建New Driver Definition 填写完选择OK 选择刚才的Drivers Test Connetion测试 N…

最受欢迎的5大Linux发行版

摘要:要统计有多少人在使用那款Linux发行版几乎是不可能的事情,但我们可以使用一些在线分析工具来大概地看看哪些Linux发行版更受欢迎。 Google Trends的数据显示,Ubuntu用户正在流向Mint,但依然在各方面都比其它Linux发行版更有优…

C#动态操作DataTable(新增行、列、查询行、列等)

public void CreateTable(){//创建表DataTable dt new DataTable();//1、添加列dt.Columns.Add("Name", typeof(string)); //数据类型为 文本//2、通过列架构添加列DataColumn age new DataColumn("Age", typeof(Int32)); //数据类型为 整形DataColumn…

使用IntelliJ IDEA 配置Maven(入门)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 下载Maven 官方地址:http://maven.apache.org/download.cgi 解压并新建一个本地仓库文件夹 2.配置本地仓库路径 3.配…

[算法]不使用*、/、+、-、%操作符求一个数的1/3

摘要:算法一直是程序员进阶的一道龙门,通常算法都是为了更高效地解决问题而创造的,但也有的只是出于学术性,并不在意其实际意义。这是近日在国外技术问答网站stackoverflow的一个热门问题,不知道你能给出几种解决方法&…

2022届互联网秋招备战

文章目录1、何为秋招?1.1应届生身份1.2秋招、春招、校招1.3、社招、海投2.秋招信息如何获取?3、如何备战秋招?3.1、简历(ps做简历)3.2、笔试准备3.3、面试准备4、日常实习和暑假实习?1、春招≠暑期实习2、什…

php 两变量值互换 方法

//方法一:$a "abc";$b"def";$a $a^$b;$b $b^$a;$a $a^$b;//方法二:list($a, $b) array($b, $a);//方法三:$a $a . $b;$b strlen( $b );$b substr( $a,0,(strlen($a)- $b ));$a substr( $a, strlen($b));//方法四&…

MySQL5.7 group by新特性,报错1055

项目中本来使用的是mysql5.6进行开发,切换到5.7之后,突然发现原来的一些sql运行都报错,错误编码1055,错误信息和sql_mode中的“only_full_group_by“关,到网上看了原因,说是mysql5.7中only_full_group_by这…

IDEA中多行注释及取消注释快捷键

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1、一次性添加多行注释的快捷键 首先选中要注释区域,然后 ctrl/ 这个是多行代码分行注释,每行一个注释…

为什么程序员不擅长估算时间?

摘要:时间估算是困难的,每一个程序员都有一个现实的估计区间,低于这个区间的估计意味着(构件,测试,检查代码的)时间开销被低估了,超过这个区间的估计意味着这个任务太大而很难预估。…

red hat enterprise linux 7关闭防火墙的方法

2019独角兽企业重金招聘Python工程师标准>>> red hat enterprise linux 7发布后,发现防火墙也变了,如何关闭防火墙呢,下面是方法 1.查看firewall的状态 [rootsztech7 ~]# systemctl status firewalld firewalld.service - firewal…

IOS —— 网络那些事(上) - http协议

作为一名并不太合格的程序员,今天要分享学习的成果,竟然讲的是网络相关HTTP协议的事情。(也算是复习了) 乍看HTTP协议的内容着实是十分复杂的,涉及到十分多互联网"底层"框架的东西。今天就先撇开这部分详细内…

【最新版】Java速成路线(急于找工作!)

文章目录计算机网络分层结构TCP/UDPHTTP/HTTPS状态码Cookie 和 SessionURI和URL操作系统线程和进程数据结构和算法数据结构算法设计模式(23种)单例工厂代理适配器观察者模板实操工具Git/SVNMaven/GradleLinux基本操作NginxELKpostmanJAVA基础语言基础JVM…

Java Web Start实例

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 JWS让用户可以下载服务器端的Java Application到本机运行,并且没有安装、配置等繁琐的操作JWS的运行原理:浏览器…

老派程序员——徒手实现伟大成就

摘要:本文介绍了三位非常著名的程序员:Ken Thompson,Joe Armstrong 和 Jamie Zawinski,他们是如何发明一门新语言,他们开发软件时会像我们一样使用当今流行的开发工具吗?当读Peter Seibel的精彩著作《编程人生:15位软件…

互联网大厂项目研发流程

文章目录阶段一:阶段二:阶段三:阶段四:阶段五:开发人员:测试人员:设计师:阶段六:阶段七:总结:本文章学习自:https://www.bilibili.com…

centos常见错误 Failed to set locale, defaulting to C

错误描述: 当在centos中使用yum命令时,输出错误: [rootlocalhost yum.repos.d]# yum list |grep prceFailed to set locale, defaulting to C 用locale检测,出现如下提示: rootlocalhost yum.repos.d]# localelocale: …

图片上传知识点梳理

在日常项目开发中,图片上传是一个十分常见的场景。而现在的各种UI框架都提供了自己的上传组件,网上第三方的上传组件也多如牛毛。可能你早已习惯了直接使用这些现成的组件,然而对于其具体的实现,却并未深入解析。本文将通过简单的…

解决 java.lang.IllegalArgumentException: Repository interface must not be null on initialization!

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 报错:Caused by: java.lang.IllegalArgumentException: Repository interface must not be null on initialization! Cause…

【狂神说】JVM

文章目录1.JVM的位置2.JVM的体系结构3.类加载器4.双亲委派机制(重要)5.沙箱安全机制(了解)6.native(核心)7.PC寄存器(了解)8.方法区9.栈10.三种JVM11.堆(Heap)12.新生区、老年区13.永…