本人投递的是服务端开发,4.18进行的笔试,一共三道题A了2.7道,最后一道题超时......估计是算法问题,也改不好了。然后4.20给我发来了21号下午的面试邀请。一面和之前贴吧里有个老哥被问的大同小异,如有雷同,那可能是同一个面试官吧?(狗头)
一面:
自我介绍
略。
问你的项目
答:楼主在实验室做过一个web应用,主要负责后端的工作。简单介绍之后,然后问了我用什么数据库(楼主用的Mysql)。
Mysql的索引是什么结构的?
答:B+树(常规题)
B+树的结构是什么样的?
答:多叉平衡查找树?然后我又讲了一下它和B树的区别...
为什么B+树查找更稳定?
答:楼主这里答得不好,我说因为B+树只在叶子节点存数据,所以非叶子节点能存更多的索引,所以高度更矮...(其实应该是每次查找都需要遍历到叶子节点)说完之后面试官让我之后再去好好了解一下B+树,吓死我了。。。
Mysql怎么优化sql语句?
答:(又是背过的嘿嘿)这里就简单说一下吧,首先分析一下慢查询日志,通过日志去找出IO大的SQL以及发现未命中索引的SQL语句......然后对于需要优化的sql语句:
- 应尽量避免在 where 子句中使用!=、<、>操作符或对字段进行null值判断,否则将引擎放弃使用索引而进行全表扫描;
- 只返回必要的列:最好不要使用 SELECT * 语句;
- 只返回必要的行:使用 LIMIT 语句来限制返回的数据;
mysql> SELECT * FROM table LIMIT 5;
- 将一个大连接查询分解成对每一个表进行一次单表查询,然后在应用程序中进行关联,这样做的好处有:
- 让缓存更高效。对于连接查询,如果其中一个表发生变化,那么整个查询缓存就无法使用。而分解后的多个查询,即使其中一个表发生变化,对其它表的查询缓存依然可以使用;
- 分解成多个单表查询,这些单表查询的缓存结果更可能被其它查询使用到,从而减少冗余的查询;
- 减少锁竞争
然后面试官接着问怎么查询一条sql语句是否使用索引?(大概是这个意思)
答:使用explain命令,通过explain命令可以得到表的读取顺序、数据读取操作的操作类型、哪些索引可以使用、哪些索引被实际使用、表之间的引用以及被扫描的行数等问题。
TCP的三次握手过程?
答:(这里照着背就行了)
-
第一次握手:Client将SYN置1,随机产生一个初始序列号seq发送给Server,进入SYN_SENT状态;
-
第二次握手:Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK置1,产生一个acknowledge number=sequence number+1,并随机产生一个自己的初始序列号,发送给客户端;进入SYN_RCVD状态;
- 第三次握手:客户端检查acknowledge number是否为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。
TCP和UDP的区别?
答:(哈哈,这里楼主背的滚瓜烂熟。)1. TCP是面向连接的,UDP是无连接的;2. TCP是可靠的, 通过TCP连接传送的数据, 无差错,不丢失,不重复 ;UDP不可靠, 即不保证可靠交付 ;3. TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多;4. TCP是面向字节流的,UDP是面向报文的;5. TCP有拥塞控制机制。UDP没有,因此网络出现的拥塞不会使源主机的发送速率降低,这对某些实时应用是很重要的,比如媒体通信,游戏;6. TCP首部开销(20字节)比UDP首部开销(8字节)要大7. UDP 的主机不需要维持复杂的连接状态表。
TCP的可靠性是怎么保证的?
答:(这个问题也是个常规问题了)
-
数据包校验
-
对失序数据包重新排序(TCP报文具有序列号)
-
丢弃重复数据
-
应答机制:接收方收到数据之后,会发送一个确认(通常延迟几分之一秒);
-
超时重发:发送方发出数据之后,启动一个定时器,超时未收到接收方的确认,则重新发送这个数据;
-
流量控制:确保接收端能够接收发送方的数据而不会缓冲区溢出
接下来就开始问我Linux的东西了(瑟瑟发抖)
用过哪些Linux的命令?
答:cat、cd、rm、vi、dir等......
如何查看一个目录下的文件数?
答:(这里楼主记得一个ls类的命令和find命令中有这个功能,面完之后查了一下,发现是ls -l 命令查看。)
Linux中rm(删除)正在被进程占用的文件会发生什么?
答:(之前在牛客看到过这个问题,就简单地说了下,我把网上的答案贴在这里了。)在 Linux 系统中,通过 rm 命令删除一个文件,实际上是在相应的目录结构中 unlink 这个文件。如果这个文件仍然被打开着,这个文件仍然可以被这个进程所使用,并将继续占用磁盘空间。等这个程序关闭该文件后,对应文件的空间才会被释放。
然后他问我知道原理是怎么样的吗?
答:(这里楼主基本上就是靠猜的了,瑟瑟发抖。)我就说了下innode节点balabala......,然后面试官说我基本思路是对的(震惊!我都不知道自己说了啥!)
算法题:
判断一个链表是否有环?
答:我一开始说的是如果知道链表长度就可以直接遍历链表,遍历的长度大于给定的长度就有环。(当然面试官后来说不给我长度......我太难了)于是想到了B方案----快慢指针,具体过程百度可以搜到,就不再啰嗦了。
有序数组找一个元素(自己写测试用例)。
答:楼主一开始写出来个二分查找都方法,后来面试官说有重复的元素让我返回最小的下标(好吧,又想了一会没想到什么好办法,只好把二分查找做到底了,意思就是每次找到了一个符合要求的元素后继续往它左边的部分继续二分查找,这样一定能找到最小下标。)
写完算法题后可能也没多少时间了,所以就没怎么问我java的知识,还是挺慌的,不过面试体验很好,面试官态度很好,而且会引导我回答问题。面完之后担心了一下午,终于在21号晚上接到了HR的电话(狂喜),约好22号进行复试。
二面:
自我介绍
略。
项目?
答:简单介绍了项目。
用到了什么技术?
答:楼主说了个时序数据库和SpringBoot(时序数据库给自己挖坑了......),然后就让我说说对时序数据库的了解(不是我负责的,只能简单说说了......)。
你的数据库里如果有一张很大数据量的表,该如何优化查询效率?
答:当时主要说了分库分表的办法。然后被细问,主要问了分表后增删查改怎么操作?(说实话这个问题对楼主来说比较难了,因为楼主太蔡了。哭腔)
算法题:
一个只有R、G、B三种字符的无序字符数组,要以RGB的顺序进行排序。(比如[B,G,R,B,G,R]---->[R,R,G,G,B,B])
答:当时楼主先想到的是统计每种字符出现的次数的方法,问我时间复杂度(O(n))。
现在不允许你用额外的存储空间(空间复杂度是O(1)),怎么优化?
场景题:
如果一个用户上传图片失败了,原因可能有哪些?怎么去定位bug?
答:这道题属于比较开放的题目了,只要言之有理即可。(其实就是楼主忘记了当时怎么回答的,狗头)
如何实现一个扫码登陆的功能?
答:不需要太详细,讲讲大概的思路就OK啦~建议参考:https://www.cnblogs.com/huanshilang/p/12365376.html
快乐的提问环节
提示:表达出你对这个职位很感兴趣的问题即可
总结一下吧,二面更注重解决实际问题的能力,当然这种能力是要建立在基础知识牢固和平时项目经验的积累的基础上的(还好那两道场景题楼主稍微了解过一点(从项目中))。
4.26通知我下午2.30HR面,激动啊!!!HR面只要表现出自己乐观积极的一面和对这个岗位的热爱就行啦!(偷偷告诉你们,HR小姐姐笑声炒鸡甜。)
4.28拿到了offer!终于上岸了!
而世之奇伟、瑰怪,非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也。祝愿各位小伙伴早日上岸,也希望各位大佬能多多谅解本帖有错误之处(楼主第一次写),欢迎指正!
全部评论
(14) 回帖