收到了京东的二面电话,我觉得这次面试有一定的广度和深度,也和面试官发生了一些争论,是一次挺有意思的面试,遂详细记录之。
面经:
首先一上来面试官让我做了一下自我介绍,经过了总共大约四五次电话面试,遇到这样的问题已经是很多次了,但是我还是简单表述了一下自己的技能栈就结束了,这个其实还可以再多说很多。
接着面试官问了一下我的学习过程(刚开始我没搞懂面试官说的学习过程是什么意思,后来了解到是自己的教育经历)。然后我表达了一下自己大连理工大学软件工程大三学生的状态。
紧接着面试官问了下我的必修课有哪些。我说了下计算机网络、操作系统、数据结构与算法、编译原理(实际上当时我不太敢说编译原理..感觉自己编译原理确实已经忘很多了)。面试官对我的计算机基础很感兴趣,说我的笔试成绩很高(京东之前有一个笔试),但是事实上京东那三道算法题我只AC了两道..顶天也只能是80了,可能选择题做的比较好?于是面试官便开始考察起了我的计算机基础。
面试官:常见的排序算法了解吗?
我:嗯,有一些了解。常见排序算法可以分为三种时间复杂度,O(n+k),O(nlog2n),O(n^2)。O(n^2)的排序比如冒泡排序、O(nlog2n)的排序比如快速排序、归并排序、二分插入排序,对于基于比较的排序算法这个时间复杂度已经不能再低了,然后O(n+k)时间复杂度的排序比如桶排序、基数排序、计数排序(可能是这个地方复杂度说多了..面试官后面很大篇幅在问我时间复杂度)。
面试官:恩,我懂你的意思了,你对排序比较了解。你能说一下常见数据结构吗?
我:我能以数据结构在Java中的体现了举例子吗?
面试官:我觉得emmm数据结构应该和语言无关吧...
我:那好吧,我以为您更想听的是Java中的数据结构。常见的数据结构简单的有链表、队列、栈、二叉树,稍微复杂一点的比如B+、B-、B*、红黑树、图等。
面试官:那现在有10w个数字,你如何找出一个最大的那个数字呢?
我:堆(不知道怎么会说出这个答案...很迷了)。(当时脑子有点抽,这个和后面几个数据结构相关问题都说的挺迷)
面试官:blablabla说了一些,大致意思就是你不觉得这个时间复杂度有点高吗?
我:(恍然大悟)实际上一次遍历O(n)时间复杂度就可以找出最大值,用一个temp变量更新最大值,直到遍历完所有数字。
面试官:(打断了我)你不用说得太细,就是一次冒泡对吧。那10w数字如何找出最大的前20个数字呢?
我:这个地方我觉得可以使用最大堆(脑子抽了,为什么是最大堆),可以在O(nlog2n)时间复杂度解决这个问题。
面试官:(感到奇怪)为什么是最大堆呢?
我:可以建一个结点个数为20的最大堆,遍历完所有数据,停留在堆中的结点就是top 20(我当时还是没反应过来)。
面试官:那么如果现在堆中的元素是1,2,3,...,20,你有一个19节点,你是放入还是不放入呢?
我:(还是没有反应过来不是最大堆而是最小堆)我觉得可以将堆的根结点替换为19,然后调整位置,判断最终19还在不在这个堆里。
面试官:那你这个行为很尴尬