空窗1年之 深睿医疗java岗(外包)——二面回顾
之前一面因为太紧张忘了面试官提了哪些问题,今天趁着二面刚面完来记录一下。
1.先来写一个二分查找吧
二分查找我提前准备过,写的时候把if(left>right)写成了if(left>=right),导致了边界问题,我打断点成功调试掉了BUG。
2.计算数组中间下标的(left+right)/2有什么问题吗(两个都是int类型)
面试官引导我说会不会有边界的问题,我顺坡下驴说了可能会溢出int类型,得到了肯定的答复,但我一点也不清楚应该怎么设计能解决溢出。。left/2+right/2 ? 后来面试官也没为难我,跳过了。
3.HashMap的底层实现
标准的八股文,看过面试鸭的题解。我讲得天花乱坠,什么JDK1.7 1.8的区别,什么头插法会形成链表环,讲着讲着讲到Hash数组扩容机制,要命的是我忘记1.8扩容的位运算优化怎么实现了,这里比较减分。。(真是自己给自己挖坑啊,有时候千万不要得意忘形,挑有把握的讲,引导好面试官,不要像我一样讲到最后翻车)
4.如果让你用java代码实现一个LRU缓存,你应该怎么写?
这题是聊着项目上有什么缓存的使用场景时带出来的,本来我因为写出了二分查找信心爆棚,听到这个问题一下子虚了。我先讲了讲LRU的定义,然后说我会用一个TreeMap去保存键,值保存最后一次使用的时间,也能实现有序(用map的思路是对的,但是TreeMap无法让value有序)。好在面试官人挺好,开始引导我选择合适的数据结构。我一开始用HashMap,但是没办法保证时间的有序,又考虑队列,但是没有Hash那么高效的时间复杂度。我脑子里不自觉的想起来之前面试鸭看过的集合使用场景,想到了LinkedHashMap,一个完美保证了Hash和队列特性的数据结构(本人智力高光时刻了属于是),面试官可能也没想到能用这个,还问我这个结构能保证key有序吗,我点开源码一看,是一个链表的Set,然后顺利的实现了get和put方法,整个过程也没卡壳,面试官也很认可。
之前没刷过这种手写LRU的题,能自己写出来还是很有成就感的。
4.说说项目上的一些比较重要的模块你是怎么实现的
能明显感觉到做完两道算法题后面试官已经有了结果,这个问题没有过多的追问,全程听我讲完了技术实现。 我主要讲了API项目的签名认证算法,kafka的消息堆积问题解决,以及Redis缓存大量数据的解决方式。整个过程比较顺利。
总结,多刷刷算法题能很大程度上提升你的数据结构设计能力,我只刷了4道简单的leetcode就已经有了初步的数据结构选型思想。而且很多薪资高的公司就爱考验这块,项目上问的反而比较少比较粗。
一面的算法题是将两个字符串类型的整数相加,leetcode有原题,我只实现了位数相同的代码。不过期间我解决了控制台的乱码问题,解题思路也是由简单(位数相同)到复杂(位数、符号不同),我觉得因为这两点一面才没有挂我。。
