Seeker的奇妙求职历险(字节跳动一面)

前言

7月12日晚上18:00,我进行字节跳动的一面。
上来就是先自我介绍,然后我介绍了一下研究生阶段做的项目,以及论文的方向。
然后面试官就先对项目进行了一些提问。

c#和Java的区别

首先问我项目,因为我写了C#的桌面端和SSM的服务器,于是就问我这两者在写的时候有什么区别。
然后我从语法糖的角度回答了一下,C#的语法糖比Java优秀一点,但是在国内的话感觉Java的生态更好一些,中间件比较多,查阅文档也方便一些,C#的话基本就只能查阅MSDN的文档,有一些麻烦。

引入Redis是否有必要

接着问了我在项目中是如何使用Redis的,然后我说一般是拿来存一些热点数据,然后他问我一般使用Redis会有一些什么问题,我就说了缓存雪崩和缓存穿透,然后问我如果服务器停电会发生什么,我回答了使用Redis的持久化。
最后就问我是否有必要增加Redis这么一个工具。
我回答说一开始的时候认为Redis会比Mysql快上不少,但是后来发现其实并没有,当初引入Redis的还有一个原因就是想做多服务器的数据同步,但是最后简化成了直接在服务器上修改数据,但是项目已经上线了不太好修改,所以就一直留在那边了,其实是没有必要引入的。

HashMap的源码

然后问我使用过HashMap吗?开始让我讲解一下。我就从源码的角度讲解了一下。
这里主要问了三个问题:

Hash为什么要右移16位异或?

我说主要是一般数组的长度不会超过16位,所以让高位也参与进来。然后他就问为什么是异或而不是与、或或者非之类的操作。
我没有回答上来,然后他提示了一下,说如果采用与的话会发生什么,那我说这样的话就是都是1的话返回1,其他返回0,这样会导致两个数与的话以小的一个为结果,导致实际上还是只用了低16位或者高16位。
他回答说这是一部分原因,还有一部分原因就是异或不用进位,速度比较快。

HashMap如何判断对象相等?

我说一般是先判断他的hascode是否相等,然后再判断他们是否equals,这边感觉一上来表述的不太好,所以纠结了一会。
然后他就问我,如果a.hasHashcode() == b.hasHashcode() && a.equals(b),那么执行put(a,"222") put(b,"333")最后实际的value是多少,我回答说应该是333,然后又问我实际的key是a还是b,我回答说b。
然后这边他给了我一点提示,我根据他的提示发现自己说错了,其实应该是a,因为put的时候不会对key进行修改。

为什么要进行树化

我在前面说了如果数组长度超过64,并且链表长度超过8会进行树化,于是他就问为什么要进行树化?
我一开始以为是问为什么要使用红黑树?所以就从二叉平衡树和红黑树的性能比较上进行回答。
然后他感觉不是很满意,就问我,和链表相比有什么优势,为什么不使用二叉搜索树?
我就回答了链表是O(n)的复杂度,二叉搜索树实际上是二分查找,时间复杂度为O(logn),然后如果数据比较极端的话,比如654321,就会导致退化成链表。
然后问我二叉平衡树怎么平衡的,我说我从红黑树的角度来说一下吧,然后说到了变色这一块,他感觉我可能看过源码就打断了我。

优先队列的源码

接下来就我优先队列使用过吗?看过源码吗?
答:用过,没看过源码。
就没问。

输入URL之后会发生什么

当他问我这个问题的时候我其实还是有点高兴的,因为感觉面试在自己的掌控之中,所以就从url解析说到了DNS查询最后到路由转发。

路由表中有环怎么办

说到路由转发的时候打断了我,问我说路由器一般是维持自己的路由表对吧,那如果几个路由器形成了环,怎么办,就比如a->b->c->d->a,如何跳出环?
答:不会,没了解过。
摘自百度百科:https://baike.baidu.com/item/%E8%B7%AF%E7%94%B1%E7%8E%AF%E8%B7%AF/8975272?fr=aladdin

Http是每次请求都要发送一个包吗?

说完了路由转发和服务器返回html页面之后,他问我,那么如果每次html里面的元素发生变化的时候都要进行http请求吗?
我说我不太清楚,但是我猜测由于http是长连接,所以可能每次不需要进行发送一个http请求,直接发送数据进行修改就行了。
然后他说,这个要看http版本号,1.0的话是每次都要发的。

Https的加密过程

然后问我Https是如何加密的,我就说了发送随机数,验证ca,然后更换加密方式这么三次请求,这个一般是对称加密,然后他先问我,CA证书有什么用,我回答说可以保证是一个安全的服务器。
然后就问我Https什么时候使用非对称加密,什么时候使用对称加密?
答:不会。
其实后来想想感觉自己*逼了。
从CA取出公钥之后客户端的确认,不就用的非对称加密?
使用公钥进行发送,然后服务器使用私钥解密。
艹,无fuck说。

算法题

到这边大概过去了40分钟,他说算法会吗?我说写的不太好。
如果前面的问题是超出了我的掌握,那么这道算法题大概就是我的噩梦了。
他就给我出了一道题:
给出一个数组nums = [1,2,3,4,5]以及k=2,要求返回一个把最后两位提到前面的数组[4,5,1,2,3]
感谢杰哥找到了题目地址:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
我说如果在平时的话,我会使用Arrays.copy方法,然后他对题目进行了补充说明,如果数据量很大,就不能进行复制,那么怎么办?
我说我一时间想不到好的办法,我想先把最后一位取出来,然后把剩下的元素右移一位,最后进行插入。
他问我这样的时间复杂度是多少?
我回答O(kn)。
他问我能否再进行一下优化?我想了一会没想法。
他就教了我一个类似并查集的算法,然后让我实现一下,我写了一下写的不是很好,最后没写完。

后记

hr小姐姐很好看,面试官小哥哥说话很好听,过程很温馨,题目很有意思,算法很有难度,下次秋招还会再来的。
明天把优先队列和JUC的三大并发工具的源码总结一下,好难呀,我发现我还把简历传错了,我说怎么一上来就问Redis。
在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/qq_33241802/article/details/107303805