官字节跳动面试官,和我聊了半小时的优先队列

2020年秋天还没到,互联网公司便按捺不住招贤纳士的步伐了,开始启动秋季招聘的提前批工作。最近有读者昨天刚参加完字节跳动的提前批一面,与我交流了他的面试经历。

在整个的面试流程中,字节跳动至少会有 3 轮技术面,每一轮面试都会考算法。 像这位读者的面试中,面试官让他写优先队列的实现算法并且讲解思路,他回答了4种实现:无序数组、有序数组、无序链表和有序链表的实现,当时面试官夸他讲得很全,结果一面过了。 今天结合读者的面试经历,我来讲一讲优先队列。

优先队列

优先队列,与堆栈和队列一样,都是元素的集合。在删除操作上,栈是先进后出的数据结构,删除最近添加的元素;普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除;在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的特性。

优先级队列的主要操作是insert,delMax(删除最大值) 和 isEmpty(判断是否为空)。

优先级队列有很多应用,例如:

  • AI中的A *搜索算法
  • 使用Huffman编码进行数据压缩
  • 事件-驱动模拟(Event-driven simulation)

无序数组实现优先队列

优先级队列类

构造一个最大优先级队列,其中具有最大值的元素具有最高优先级。Key必须扩展Comparable接口。这是因为我们要在优先级队列中的元素之间进行比较,而不是在优先级队列对象之间进行比较。

优先级队列类:Key[] pq是通用类型的数组 ,N表示该数组中的元素数。

官字节跳动面试官,和我聊了半小时的优先队列_第1张图片

 

操作函数

insert():将元素插入数组的末尾

delMax():每次查找最大元素数时,都需要扫描所有元素。删除最大元素的技巧是,将最大元素与数组中的最后一个元素交换,然后将其删除。

isEmpty():判断队列是否为空

官字节跳动面试官,和我聊了半小时的优先队列_第2张图片

 

有序数组实现优先队列

优先级队列类

官字节跳动面试官,和我聊了半小时的优先队列_第3张图片

 

操作函数

insert():将元素插入到已排序位置的数组中,维护排序的数组。

delMax():max元素将始终位于末尾,将其删除。

isEmpty():判断队列是否为空。

官字节跳动面试官,和我聊了半小时的优先队列_第4张图片

 

无序链表实现优先队列

链表节点的实现

官字节跳动面试官,和我聊了半小时的优先队列_第5张图片

 

操作函数

insert():采用头插法将元素插入链表。

delMax():每次查找链表的最大元素数时,然后将其删除。

isEmpty():判断链表是否为空。

官字节跳动面试官,和我聊了半小时的优先队列_第6张图片

 

完整代码

官字节跳动面试官,和我聊了半小时的优先队列_第7张图片

 

有序链表实现优先队列

链表节点的实现

官字节跳动面试官,和我聊了半小时的优先队列_第8张图片

 

操作函数

insert():将元素插入链表,并保持链表的顺序。

delMax():链表的最大元素始终位于链表头部,每次删除链表的最大元素时,将链表头部的元素删除。

isEmpty():判断链表是否为空。

官字节跳动面试官,和我聊了半小时的优先队列_第9张图片

 

完整代码

官字节跳动面试官,和我聊了半小时的优先队列_第10张图片

 

总结

咱们玩归玩,闹归闹,别拿面试开玩笑!吐槽字节跳动的“凡面试必算法”的同时,也要明白为啥很多公司要考这么多算法?其实核心是看候选人是不是足够聪明,很多公司招聘工程师的必要条件就是聪明。

优先队列的实现本身不难,但是像读者这样,优先队列的四种实现方式全部讲出来的面试者很少。读者顺利通过了一面,接下的面试还在继续,祝愿这位读者能顺利拿到字节offer!


接下来是小编通过一些大厂的朋友要到了他们内部的Java面试题,资料难得,而且还是近一年的真实面试题;

分别有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

官字节跳动面试官,和我聊了半小时的优先队列_第11张图片

 

小编网盘也通过这些年的积累,把Java电子书也分享给大家,大概有10G左右的资源

 

官字节跳动面试官,和我聊了半小时的优先队列_第12张图片

 

珍藏多年的230个高端简历模板,也一起送给大家

官字节跳动面试官,和我聊了半小时的优先队列_第13张图片

 

 

 

官字节跳动面试官,和我聊了半小时的优先队列_第14张图片

你可能感兴趣的:(java)