乐趣区

关于算法:程序员如何玩转力扣刷题

前言

大家好,我是 bigsai,好久不见!明天就给各位小伙伴分享我本人刷题力扣的一些小办法,不肯定很有用然而能够参考,祝你更高效的变强!

最近在一些群聊、私聊中遇到很多的一个问题就是:刷题,大家也都器重到算法刷题对冲击大厂的重要性,越来越多的人开始卷起来了!

但有的人是这样卷起来的,卷的本人都懵了。

明天,我就给偏初学者的各种问题谈谈集体刷力扣这方面的观点。

刷哪些题?

大家刷力扣,指标必定就是为了冲击大厂的面试口试,小局部就是为了保持刷题放弃感觉晋升本人算法编程能力,那么你必定要把 重点内容 先把握,哪些是重点内容呢?

剑指 offer:

首先是剑指 offer(https://leetcode-cn.com/probl…),剑指 offer 的优先级还是很高的,待业必刷。在牛客上和力扣平台上都能够刷剑指 offer 的题,然而我集体更举荐力扣这个平台,我第一次刷剑指 offer 就是和大家在牛客平台上刷的 (尽管有点工夫不晓得还有没有人记得),然而前一段时间在力扣上刷剑指 offer,有局部题(很少) 把本人很久前的代码提交试了一下发现 wa 了。所以牛客测试数据绝对还是比拟弱的,力扣上的测试数据绝对较多,在大部分状况,你过了代码基本上就没有什么逻辑破绽了。

除了剑指 offer 名气大,我举荐你刷剑指 offer 的一个起因是剑指 offer 的题目是真的经典!短短六十多道题,内容笼罩常见数据结构比方链表、二叉树、图、队列、栈、哈希表等等,常见的算法和经典问题包过二分、动静布局、全排列问题、滑动窗口、贪婪、分治、排序、位运算、dfs、bfs 等等,刷完这些题,是真的能够播种和学到很多!

另外一方面就是剑指 offer 在面试口试中呈现是真的 十分高频,面试官考查的题目个别都是经典题,面试官不发明题目,只抽选题目,而抽选题目标题目根本就是力扣和剑指 offer 的题目,剑指 offer 就是十分高频的题库之一。

力扣 HOT100| 力扣前 200

力扣 HOT100:https://leetcode-cn.com/probl…

力扣前 200:https://leetcode-cn.com/probl…

优先力扣 HOT100,力扣 HOT100 是对力扣某一时间 (因为力扣题始终在减少) 题库选出的 100 道优质题,这些题跟剑指 offer 相似,都是一些高频问题,有不少问题的确还是有难度的,对于不少人来说特地容易卡壳。然而如果力扣 HOT100 能刷完,那你其实加上剑指 offer 快 200 的题量就挺可观的了。

力扣目前曾经有两三千道题目,并且还在减少,所以想刷完力扣,简直是不太可能的,如果想程序刷,还是举荐前 200,力扣前 200 和力扣 HOT100 重合很大,前两百品质还是很高的(不是意思前面品质不高,只是那么大题库刷到前面就会呈现很多同类型、同套路的题目),所以还是举荐刷完力扣前 200 的。

刷完这几个局部大略可能领有 靠近 300 高质量题的刷题量,我感觉应答大部分的互联网公司面试是足够足够了,出一些变换本人也可能绝对容易的看进去。

刷题程序?

下面列举了待刷的题库,既然晓得了要刷哪些题,有没有一个比拟举荐的刷题程序呢?是否须要分类刷?

是否要分专题分类我感觉这个看人的。

如果你有数据结构与算法根底,比方考研或者平时数据结构学的还不错,常见数据结构与算法原理明确可能实现局部,又或者有局部刷题教训,那么我举荐你间接程序着刷就完了。从主观来说,力扣和剑指 offer 下面的题目有难题,也有须要高级数据结构的,但更多的是在 数据结构或者逻辑根底上的奇妙思维题型更多,如果你有数据结构与算法的根底,你还是比拟容易 get 到考察点的。程序刷的途中遇到某个不会的技巧或者数据结构,学习一下退出本人的 ” 脑库 ” 中即可。

如果你是真的小白,那你就要为本人手动找到一条可行走的路,那我举荐你能够依照一些专题去各个击破。因为你是小白如果程序刷这个题不会,学了,在刷下一题,又学了个齐全生疏的新货色。没有根底短期内学习太多比拟生疏的新货色很难排汇,很容易忘,就会陷入怎么学不会的苦恼中。所以你能够把刷题当成一个台阶,一层一层往上爬,刚开始找 easy easy 那种 a + b 类型的题求过。对于数据结构方面的题,从链表开始先学透单链表、双链表、循环链表各种插入删除实现,而后在题库中找链表相干题进行一一攻破(链表中的也可细分链表插入、删除、反转、合并、查找、排序等等),链表大专题之后二叉树大专题、哈希…… 这样你短期内学习某一个数据结构或者算法技巧,多去刷题坚固排汇成果比拟好!在这种状况切勿感觉简略就草草下一个,你不敲代码,可能不会晓得本人会呈现什么问题。

三个为什么

为什么见到一个题没思路?

这种状况大概率是因为见少了,刷题也是个迟缓的过程,见得多刷的多些,来的感觉能力更快一些。还有一部分可能因为给本人安顿的刷题路线不够温和。你上来去肝 hard 难度的没思路不是很失常。

简略题很容易懂实现起来很难?

这种状况可能根底逻辑可能不足训练,对编程语言的汇合框架把握也有所欠缺。有些题可能波及到汇合框架 (Map、Set、List、Stack、Queen) 各种嵌套、联立须要你有个清晰的层次感和逻辑。

你刷题,须要纯熟应用一门编程语言,相熟这个编程语言的常见操作 api、汇合框架、函数,这些是解决问题的工具帮忙咱们提高效率(不至于每次手写个队列、手写个哈希表吧)。

这个问题举荐能够先刷几道简略的字符串解决问题,字符串解决问题很多波及到的汇合框架和逻辑管制比拟多,如果工夫短缺举荐 PAT 乙级的题目刷一些练手锤炼逻辑和编程语言把握。

看了很多题解为啥还是不会刷题?

看了很多题没刷那跟没刷区别不太大,印象强劲。从学习角度,刷题和咱们学数学的形式有点类似,学会了数学题公式和例题,但还须要大量练习能力真正把握。

只有本人亲自敲了每一行代码,每一行代码逻辑是什么,是本人思考进去的而不是看懂他人的思考。从 0 到 1 残缺实现整个程序,这能力行成一个残缺逻辑,而后可能呈现各种 bug 本人调试看看找出问题。

能够看题解,看了本人要能齐全写进去才行,如果刷了 1000+ 题,你看了题解不刷没问题,看个思路过了被卡的中央就行。但如果刷了 100 不到,那你看懂还是老老实实依照他人的逻辑 闭卷式的复现一遍。不去实现说有很多问题,记不住,也没啥奇怪的。

总结一下,如果刷题量不到 100 感觉状态不行就简略粗犷多刷题先,如果刷了两三百状态还是很差那么就要好好找一下其余起因。

拿到一道题的解决流程

拿到一道题,正确的刷和学习办法是怎么样的呢?

确定考察点、确定思路

读到一个题,读完题意后首先就是要理解这个题到底考查的内容是什么?当然如果你依照专题来刷,那可能这方面就容易很多。首先能够确定下题型大类型,是图论的,还是二叉树,还是字符串的,还有最常见数组给的一堆数据。就要拿着这个类型的题目往这方面常见算法考察点靠。比方给个数组数据让你查找计算,有可能是双指针,有可能是哈希,有可能还是位运算,还可能是动静布局,还可能是要贪婪解决。不过大部分题是在各个经典算法的经典问题上进行一些变动,要晓得经典算法解决的哪些经典问题。

如果能确定考察点,能够想想细节开始实现;如果确定不了考察点,没思路,先别间接看题解,看看题目 标签 的提醒。有时你看一个题可能说:这题啥办法啊我只会暴搜,有的的确就是搜寻剪枝……

除了标签,还要看 数据范畴!数据范畴内的数据都是可能呈现的,不同数据范畴可能应用办法不同(这点数组题较多,有些题巧用哈希、原地置换对数据有要求)。

如果本人看了标签想想来灵感那最好,如果还是没有灵感,那点一下题解。能够从标签题目中看看能不能有灵感,有不少题解会给足够多的暗示有些人看到就能明确了。

如果还是不会那就老老实实点进去看看他人的思路,有的是视频,有的是图文,看懂为止,要是还本人看不懂,要么销假一下他人,要么放弃吧!

编写代码、测试

编写代码的过程不要有任何参考!编写代码的过程不要有任何参考!重要的话说两遍,思路能够看,他人的代码也能够看,你本人写代码不要参考和 ctrl c + ctrl v,工程项目能跑起来就行为了效率都是 cv 大法,然而面试口试题根本要你闭卷,有的还要你用在线 IDE 连提醒都不全的。

写代码经常要思考常见问题:测试数据边界(比方 Integer.MAX_VALUE,Integer.MIN_VALUE 这种边界数值),循环管制边界解决,开端数据处理(有时候会被忘记解决),非凡异常情况思考,数值范畴是否正当,算法复杂度是否可能跑进去,数据深浅拷贝,简化反复遍历和操作,变量命名清晰,正文较为残缺……

写完代码,用测试案例多测测,确保十拿九稳。力扣常常出空值测试案例,因为这个 wa 了很屡次……

如果呈现和设想中不一样的问题,先看一遍本人代码逻辑看看是否看出问题,如果看得出正好,看不出的话本人打印输出或者 debug 找找问题,直到改对为止,有很多题须要思考比拟全能力 ac。

办法、后果比照

不要认为 ac 了就完了,你要看看本人工夫上超过了多少人,举荐从这两个维度来掂量本人的代码:

要超过 70% 以上的人 (依据本人要求适当进步):大部分题超过 70% 阐明你的办法上是没问题的,可能有些小的方面能够进行优化。比方 StringBuilder 代替 String 进行字符串拼接,应用char[] 数组代替 String 进行遍历枚举等等。

本人的办法在好办法工夫范畴内:有些题比拟卷,大家都是最快办法你的代码可能比他人差 1ms 就显得很慢,这时你只有确定你的办法很优良就能够不肯定要谋求 100%,并且这个工夫花销不同评测姬进去后果可能也不同的。能够看看大家的工夫花销区间,如果你的办法跟最快的在几 ms 或者 30% 工夫范畴,其实都是 ok 的。他人 4ms, 你 5ms 没啥问题,他人 50ms,你 70ms 也没啥问题,然而如果他人 80ms 你 800ms 那差的太多就要看看本人逻辑和代码了。

另外,力扣你点击后面工夫的柱状图是能够看到他人工夫开销较小的代码(有的当初跑可能因为测试数据变动没那么快了),能够参考学习一下他人的解决形式。

坚固进步

过了这道题,能够看看题解区别人有没有更奇妙的解决办法,当你本人 ac 之后和他人有个间接比照印象会比拟粗浅:还能够这样!

如果感觉这类题型把握不扎实还想再练一下能够看类似题型去及时坚固一下。

结语

下面的一些办法仅限于给一些初学者倡议,不肯定很精确高效能够参考,如果下面题差不多有闲余之力,举荐能够跟着每日一题打卡,半年就是 180+ 题量,一年就是 365 题量,相当主观!

首发原创公众号bigsai, 欢送关注,一起提高!

退出移动版