“金三银四”要来了!临时抱佛脚刷算法题有用吗?

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

每年的3月和4月都是跳槽季,各地考研成绩陆续公布,公务员考试也接近尾声,无论是刚毕业的同学还是工作多年的老司机,新的一年里都想再搏一搏,所以这两个月被大家称作“金三银四”。

众所周知,BAT 等互联网名企,在招聘技术岗位的过程中,对算法和数据结构都会重点考察。所以,这段时间有意找工作的程序员们都在疯狂刷算法题。

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

但算法易学难精,临时抱佛脚大搞题海战术其实很难顺利进阶,在刷题的同时,还需要梳理好知识结构,把算法从理论到实践通通吃透之后才能拿到Dream Offer!

“一个优秀的程序员和一个不合格的程序员之间的区别在于,他是否将数据结构看得比代码更重要。不合格的程序员总是在关注代码,而优秀的程序员则会更看重数据结构。”

Pascal 之父及图灵奖获得者尼古拉斯·沃斯(Niklaus Wirth)也曾提出了一个著名的公式:算法+数据结构=程序。由此可见,数据结构和算法才是程序的核心。

虽然数据结构和算法都无比重要,但现实情况却是很多工作了三五年的程序员并不重视数据结构和算法,他们所实现的程序往往运行效率低且难以维护。

面试官为什么爱问数据结构与算法,答案很简单:

算法能力能辨别一个程序员的技术功底是否扎实;

算法能力是发掘程序员的成长潜力的关键手段;

算法能力能够协助判断程序员在面对新问题时,分析并解决问题的能力。

接下来,异步君将带大家了解算法与数据结构中,队列的基本知识——

01

队列

队列(queue)是一种操作受限的线性表,通过该线性表所存储的元素具有顺序性。它的插入操作只被允许在表的后端进行,而删除操作则只被允许在表的前端进行。进行插入操作的端被称为队尾,而进行删除操作的端则被称为队头。

队列中的数据以先进先出(First In First Out,FIFO)的方式进出队列,也就是说先入队的元素先出队,而后入队的元素则后出队。队列提供了两个主要操作:入队(enqueue),即将某个元素添加到队列的尾部;出队(dequeue),即将队列里最先添加的元素移出队列。

此外,队列一般还具有特定的容量,如果队列中添加的元素总数超过了容量,则将会导致队列处于溢出状态。队列的实现方式主要有两种:基于数组和基于链表。它们都提供了统一的接口,即入队和出队,唯一的区别就是使用了不同的结构来存储队列元素。

02

基于数组的队列

我们先看基于数组的队列的实现方式,该方式包含的四要素分别是数组、队头(head)指针、队尾(tail)指针以及队列操作集。

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

其中,数组用于存放元素,队头指针用于指引队头位置,队尾指针用于指引队尾位置,队列的核心操作为入队和出队。此外,队列所存放的元素数量不能超过数组的长度。

❖ 入队操作

现准备对“the”“monster”“is”“coming”四个字符串分别进行入队操作,下面我们看看整个过程。

① “the”入队后,队尾指针 tail 右移一个位置,指向索引为 1 的位置。

② “monster”入队后,队尾指针 tail 再右移一个位置,指向索引为 2 的位置。

③ “is”入队后,队尾指针 tail 继续右移一个位置,指向索引为 3 的位置。

④ “coming”入队后,队尾指针 tail 继续右移一个位置,最终指向索引为 4 的位置。

我们可以看到在整个过程中队头指针 head 都不移动。

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

❖ 出队操作

接着再对队列中的元素进行两次出队操作。

① “the”出队后,队头指针 head 右移一个位置,指向索引为 1 的位置。

② “monster”出队后,队头指针 head 再右移一个位置,指向索引为 2 的位置。我们可以看到在整个过程中队尾指针 tail 都不移动。

由于数组的长度是固定的,我们从上面的执行过程可以看到,在不断进行入队和出队操作后两个指针都将一直往右移,那么,如果当指针到达数组最后位置时是不是就得重新创建数组呢?答案是不用。

我们可以通过循环机制来重用数组,即把数组看成是首尾相连的,当到达尾部后,下次操作将重新回到首部。前面已经执行了四次入队操作和两次出队操作,现在准备继续对 6 个“a”进行入队操作。

在对 5 个“a”执行入队操作后,队尾指针 tail 已经到达了数组的尾部。此时,如果再对第 6 个“a”执行入队操作,则队尾指针 tail 将重新回到数组首部。

03

基于链表的队列

接着继续看基于单向链表的队列的实现方式,该方式包含的四要素分别是链表、队头(head)指针、队尾(tail)指针以及队列操作集。

其中,链表用于存放元素,队头指针用于指引队头位置,队尾指针用于指引队尾位置,队列的核心操作为入队和出队。

使用链表结构来存放队列元素时可以不必担心容量的问题,而基于数组的队列所存放的元素数量则不能超过数组的长度。初始时,队头指针和队尾指针都不指向任何节点,且链表为 NULL。

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

❖ 入队操作

现准备对“the”“monster”“is”“coming”四个字符串分别进行入队操作,下面我们看看整个过程。

① 创建“the”节点,队头指针和队尾指针都指向该节点。

② 创建“monster”节点。

③ 将“the”节点指向“monster”节点,并移动队尾指针使其指向“monster”节点。

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

④ 创建“is”节点,并将“monster”节点指向该节点,队尾指针指向“is”节点。

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

⑤ 创建“coming”节点,并将“is”节点指向该节点,队尾指针指向“coming”节点。

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

❖ 出队操作

接着再对队列中的元素进行两次出队操作。

① 取出队头元素“the”,然后将队头指针前移一位。

② 废弃“the”节点。

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

③ 同理,第二次出队操作先取出“monster”元素,然后将队头指针前移一位并废弃“monster”节点。

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

好书推荐

《趣学算法》

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

每种算法都有4~10个实例,共45个大型实例,包括经典的构造实例和实际应用实例,按照问题分析、算法设计、完美图解、伪代码详解、实战演练、算法解析及优化拓展的流程,讲解清楚、通俗易懂。

《趣学数据结构》

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

采用C++语言编写,但不使用类,保证学习C语言的人也能看懂。各章包含大量图解,结合实例讲解数据结构的基本操作,力求通俗易懂。

《算法详解 卷1 算法基础》

“金三银四”要来了!临时抱佛脚刷算法题有用吗?

算法详解系列图书共有4卷,本书是第一卷——基础算法。本书共有6章,主要介绍了4个主题,它们分别是渐进性分析和大O表示法、分冶算法和主方法、随机化算法以及排序和选择。

学就一个字,坚持就是胜利!

坚持学习都会有收获。

为了自己的梦想Offer,

加油吧!

发布了523 篇原创文章 · 获赞 293 · 访问量 89万+

猜你喜欢

转载自blog.csdn.net/epubit17/article/details/104423481