学习心得_我的算法学习心得

886e4c0ec7f0eadd791603f3244970b5.png
关于

严格来说,本文题目应该叫作“我的数据结构和算法面试学习心得”,但这个写法实在太绕口,所以干脆叫“我的算法学习心得”,希望对大家有帮助。

需要说明下,本文主要是应对面试的算法学习。

这篇文章讲了什么 ?
  • 对于算法的认知

  • 算法的方法总结

  • 小结

算法的认知

回首我当初学习算法的道路,整个过程是异常的艰辛。

特别是刚开始的那几个月,一天可能也做不出来几道题。

有些题看起来很简单,在提交的时候总是有各种测试样例不能通过;有些题可能直接一点思路都没有;有些题能通过,但是运行时间特别长,代码也很冗余;甚至有些题自己当初明明会了,隔一段时间又不知道该如何处理 ......

这些都是我在初学算法时遇到过的情况,其实在刷题过程最直接的是下面两个问题:

  1. 刷哪些题 ?最新的 LeetCode 题库已经有 2000 多道了,我们不可能都刷,因此在有限的时间内刷哪些题可以最大程度得使我们足够应对面试变得十分重要。

  2. 刷到什么状态才算到达面试要求 ?经历一段时间刷题积累,总是不能确定是否达到大公司的面试标准,刷题到何种程度才足够呢 ?

刷哪些题

如果刚开始准备算法,可以选择 LeetCode 下探索模块中的专项突破,将常见的数据结构和算法都认真的夯实一遍, 这一部分内容是我们整个算法大厦的基层,很多巧妙的算法都是从它们延伸出来的。

这一部分的例题可以帮助我们复习数据结构的知识,也能帮助我们培养做算法题的感觉。(大部分都是简单的题型)。

在熟悉各种数据结构和基础算法后,就可以选择定向刷题

首推将 LeetCode 中剑指 offer系列,总共 75 题,下面是我当时刷题的截图:

008f87a59749cbb3dec1af5a90bd6327.png

剑指 offer 系列我当时刷了 3 遍,这一部分题是属于必须突破的,因为在面试的过程重复率特别高,并且这 75 道题都十分的经典,涉及到常考的全部题型。

当对剑指 Offer的 题足够熟练之后,可以考虑联系 LeetCode 下面的系列:

6e8e4fe1cf2cef0a0c79a4684a9e32e2.png

比如:HOT 100,精选算法 200题,其实这些系列里面有大量的重复题。

到这,算法题的数量基本是足够了,刷题大概 200 - 300 之间是足够面对现在互联网公司的算法题,至少在我的面试过程中,算法题基本都可以快速的解决掉。

刷到什么状态才算到达面试要求

在我开始准备算法的时候,这个问题也经常会出现在我脑海里,但后来我就想明白了,这件事情换个角度思考其实很容易回答。

假设自己是面试官,算法的考察无非是两个维度的思考:

  • 快速过滤一批只会背面经的学生

  • 通过手写算法题判断应聘人的逻辑思维能力,代码风格。

逻辑思维能力、代码风格是面试官异常注重的能力。

从这两个角度出发,能清晰的知道互联网公司考察的算法题一定不会太难,以常见的数据结构或者经典算题为主,不像 ACM,考个线段树,KMP 算法。

其实想想也明白,正常一场面试时间不会超过 1 个小时,如果一道算法题花费半小时,加上自我介绍时间,面试官就没有剩余时间去问其他的知识。因此算法题要保证在 10 分钟内解决。

分析到这,我们就可以确定刷题需要达到的标准:

  • 代码风格

  • 速度

  • 最优解

代码风格

我在美团的实习阶段,对代码风格的重要性有了深刻体会。

一次偶然机会,我问当时的主管如何看待算法面试。当时给的直接的答案是,代码风格一定要优秀,这是算法的前提。

代码风格主要是以下几个方面:

  • 清晰、直接的命名,包括方法名,字段名,类名等;

  • 清晰的逻辑关系,通过巧妙使用换行符分离不同的逻辑块;

  • 注意边界问题。

这里我放一张个人的算法题截图:

d4afd286856fac4a38b5e8d17c532882.png

具体的代码风格,可以参考《阿里巴巴 Java 开发手册》。

速度

速度,是算法面试的过程中最重要的考核因素。

正常情况下,一道算法题要在 10 分钟以内通过所有的测试案例,超过这个时间很大程度会给面试官留下不好的印象。

速度的提高的核心点就是: 模板和套路。

当刷题量超过 200 的后,大部分人都会发现很多题都有一种熟悉的感觉,但是感觉是不靠谱的,我们需要将它转化为模板和套路。

模板是对算法题的固定解法,比如快排,深度优先,广度优先,这些经典的算法思想都有固定的模板。我们需要将这些模板进行统一的总结、归纳,并转化为下意识的反应。最直接的方式就是背诵下来。

模板的总结是提高速度的最佳手段。

套路是指算法题的思考切入点,比如:链表,常见的解决思路:

  • 涉及到删除操作时候,需要维护一个 next 的指针;

  • 存在对头节点添加和删除操作,需要引入虚节点;

  • 距离相关的链表题常用的思路是快慢指针;

  • 链表的边界问题,可以通过画一个案例,跑一遍代码解决。

在刷题的过程,要反复的总结模板和套路,然后应用到自己的刷题过程中,反复迭代,持续改进。

图中就是我在刷题过程中的模板和套路总结。

c5c9650dcb780082162a24b9ed0dd02c.png

最优解

最优解主要是从两个角度考虑,空间复杂度时间复杂度

在面试过程,大部分都是用空间换时间。Hash 表,有序队列,滑动窗口,双指针,这些都是解决优化的常见思路。

最优解的总结主要是参考网络上优秀的解法,在每次做完题之后,我都会看下自己的时间复杂度和空间复杂度是否最优,如果不是,参考别人的解决思路,然后反复的总结,形成文字,思考套路。

刷题的方法总结

刷题最重要的方法就是:坚持反复迭代

坚持

刷算法题最重要的方法是坚持,刚开始的痛苦是不可避免的,只有一定的积累之后,当我们才会慢慢的形成自己的模板和思考套路,才会产生质变。

坚持就是算题最有效的方法。

【反复迭代】

“ 巧妇难为无米之炊”,基础数据结构和经典算法的模板和思路就相当于刷题的武器,如果缺乏这个基础,我们很难在面试算法上有所突破,比如给你一个有序队列的面试题,如果你大脑中从来没有有序队列这个概念,不管你怎么努力都很难想出来做题的方法。

因此算法最终的落脚点一定是经典题型的模板和套路,需要将这个观念贯穿整个刷题的过程,在每次做完一道题之后,需要进行题型的模板整理,常见的思考切入点总结,然后将最新的总结应用到下一次的刷题过程中,反复的迭代。

小结

在准备算法的过程,我们遇到的最大问题是:刷哪些题如何确定是否达到面试要求

刷题主要从专项开始,在熟悉常见的数据结构和算法后,重点去突破剑指 offer 的经典例题,之后再刷 Hot 系列,最终题量能到达 300 ,基本就满足面试要求了。

在做题的过程中,重点关注代码风格、速度、最优解 三个考核因素,参考优秀的解题思路,持续提炼属于自己的模板和套路,反复迭代,不断的优化。

算法的掌握最终落实在坚持和反复迭代,骐骥千里,非一日之功,希望同学们可以持之以恒。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值