五分钟学编程:怎样才能学好笔试面试最爱考察的算法

简介:

原创声明

本文首发于微信公众号【程序员黄小斜】

本文作者:黄小斜

转载请务必在文章开头注明出处和作者。

本文思维导图

在这里插入图片描述

什么是算法

上回我们有一篇文章,讲述了作为一个新人程序员,如何学习数据结构这门课程,其实呢,数据结构和算法是息息相关的,为什么这么说呢,因为数据结构本身只是一个载体,而在数据结构之上产生作用和输出价值的东西其实是算法。

比如数据结构里的数组,看似非常简单的数据结构,却可以支持很多复杂的算法,比如动态规划,比如DFS和BFS,再比如字符串算法、二叉树算法等等。那么算法到底是什么东西呢,不妨让我们来看看官方的介绍。

根据百度百科的介绍,算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

其实,算法的本质就是给你一组输入,运算之后给你一组输出,因此,算法帮人们解决很多问题把抽象的问题具体化,把一个问题转化成另外一个问题。

认识算法的N个阶段

我第一次遇到算法题,还是在我考研复习数据结构的时候,那个时候我看到的算法题其实都是很基础的题目,比如把数组中的两个元素置换,把两个链表合并成一个,但对于我来说已经是很有难度的事情了,那时候我连伪代码是什么都还不懂。

第二次认识算法,还是在研究生期间找实习工作的时候,面试的时候总有一些关于算法知识的考察,这些算法题比之前自己学数据结构的时候要更难一些,比如要让你描述一下快排的过程,或者是二分查找的过程,由于是电话面试居多,一般都不会考察太复杂的问题。

第三次认识算法,是在面试了头条这类对算法要求极高的公司之后。当时我对这类公司的算法面试难度还没有足够的认识,几乎没有准备什么算法题就去参加面试了,头条不像其他公司,绝不是问一些类似快排这样的简单算法题敷衍了事,而是会直接掏出一道BFS或者DFS让你做一做,而且经常不止是一道题。我只记得当时面试的时候,看了题目半个小时啥都没写出来,非常尴尬。

第四次认识算法,是在参加了一些公司的笔试之后。和笔试算法题相比,面试算法题简直是小巫见大巫,好歹面试题考察的还是一些经典的算法,可能刷一刷剑指offer和LeetCode的简单或者中等题就能搞定了,但是笔试题就不一定的,出题人的思路千奇百怪,很多时候解法也很古怪。整体来看,通常笔试算法题的难度是最高的,特别是像字节跳动这种对算法有变态要求的公司,基本上算法题一道都写不上来。

算法学习之路

虽然我学习算法的道路一直不太顺利,但是想要进BAT大厂,算法不过关肯定是不行的。因此,我对于上面每个阶段的问题,都制定了一些对应的学习方案,让我应对每个阶段的算法问题。

数据结构与算法

数据结构这门课,其实很多时候就是我们的算法启蒙课,当初我是在考研的时候复习的,用的教材是《天勤数据结构》但是对于不考研的同学来说,我觉得还有很多不错的书可以参考,比如《大话数据结构》学好数据结构是学好算法的基础,至于怎么学习数据结构,比如回去看看咱们的上一篇文章,你就可以得知一二了。

直接上剑指offer

有了数据结构的基础打底之后,至少你在看算法题的答案时,也能大概看懂了。但是,数据结构里的那些算法,很多时候是不够用的。当你了解到《剑指offer》里这本书的算法是笔试面试经常要考的内容,再去看看这本书里题目的难度,你就会发现事情并不简单。

对于只有一点数据结构算法知识的同学来说,直接上剑指offer是有难度的,毕竟很多题目的解法你之前见都没见过,有的题目你看了答案也会很快忘记。

其实,这本书里大部分的题目都不会用到什么特别复杂的算法,但是很多题型你可能确实是第一次见过,刷题这件事情没有捷径。这个时候你能做的就是多做题做看几遍书,真正做到能把题目自己写一遍,才能算是掌握了这本书里的算法。

笔试题级别的算法怎么学

既然已经看完了剑指offer,是不是可以直接开始学习笔试题级别的算法了。
且慢,我给你看一样宝贝。其实,剑指offer的那些算法,大部分都还是在数据结构算法的范畴之内,而在如今的笔试面试题库里,还有很多的经典算法,这些算法题就要到LeetCode里才能施展拳脚了。

比如动态规划,深度优先、广度优先、回溯算法等等,这类算法题光靠自己想是想不出来的,因为这些题目的背后都是一些经典的算法和解题思路,你之前没见过的话,想破头也不可能想的出来。

而这些算法,我之前也一直没找到合适的学习方式,总是东一榔头,西一棒子,看一些碎片化的文章来学习。直到后来我看到了基本还不错的算法书,比如《图解算法》以及《啊哈算法》把一些比较有难度的经典算法都做了介绍和讲解,当然了,现在还有很多的算法爱好者会做一些这类算法的分享,比如五分钟学算法的算法动画,程序员小灰的漫画算法,都是比较出色的例子。

搞定LeetCode和真题

最后一步,可能也是最关键的一步,就是要进入算法题库的最高殿堂,LeetCode了,这个刷题网站想必很多同学都听说过,特别是有志于进入互联网大公司的同学,这个是必知必会的。

LeetCode的题库有非常多的题目,但我其实也只刷了150道题而已,当初我跟着一篇LeetCode刷题指南完成了刷题,详见:,当时我把很多常考类型的题目都刷了一遍。其实,LeetCode的题目一般刷2-3遍是比较靠谱的,看到原题的时候要保证自己能做对。

再说说历年的笔试真题吧,如今很多互联网公司的笔试面试都在牛客网上进行,因此这些题目一般也都会收入到牛客网的真题题库中,这个时候,我们就应该多去刷一刷这类题目,特鄙视你感兴趣公司的历年真题,最好都刷一遍,毕竟很多时候出题人也会偷懒去拿以前题目做修改,甚至直接照搬原题。

而且,这些互联网公司的算法真题一般都出的很特别,多做一些,你才能掌握这类题目的规律,正如数学题一样,必须要多做多练,才能够在实战时也保持镇定。

推荐资源

算法类的学习资源可以说是非常多了,这里我只推荐一些我觉得还不错的资源,但是内容也不会少,够你们看很长一段时间的了。

数据结构方面的资源可以参考这篇文章,这里主要推荐算法方面的学习资源。

书籍

《算法图解》
《啊哈算法》
《剑指offer》
不推荐《算法导论》即使盖方便面也有点重了

视频

《LeetCode刷题班》
《直通bat算法刷题课》
小甲鱼的一些经典算法课程

其他

五分钟学算法的算法动画
程序员小灰的漫画算法
LeetCode或LintCode

总结

关于算法的学习,今天就先讲到这里。其实我们所讨论了算法学习方法更多地是面向笔试面试的,讲究的务实和高效,帮助你快速地了解要学习哪些内容,以及按照怎样的一个步骤去学习。

整体看来,先学好数据结构,然后用剑指offer强化练习,再去看一些算法书籍巩固基础,了解经典算法,最后上手LeetCode和真题,不断训练自己的解题能力,强化自己的算法能力,在考前一个月甚至几个月保持这样的状态和解题手感,会让你在实战时发挥更加出色。

对了,你想问我文章里提到的资源去哪找?我已经给你准备好了
在我的公众号【程序员黄小斜】回复“算法”即可领取对应的下载地址。

写在最后

如果觉得本文对你有帮助的话,请你也不要吝啬你的“好看”哈,转发朋友圈就是对我最大的支持啦,你们的支持是对我最大的鼓励。
对本系列文章有什么建议和意见,也欢迎留言告诉我,期待你的回馈。

微信公众号:程序员黄小斜
知乎:黄小斜
B站:黄小斜

image

相关文章
|
1月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
46 2
|
2月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
2月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
35 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
2月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
2月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
2月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
39 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
90 2
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
28天前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?