字节跳动java后台实习面经

平衡二叉树:每一个节点的左子树和右子树高度绝对值最多为1,它的左右子树也都分别是平衡二叉树。
*二叉查找树:*二叉查找树又称为二叉排序树和二叉搜索树:左子树所有节点上的值均小于根节点的值,右子树上所有节点的值都大于根节点的值
Hash值一样的时候不添加再链表里也不能覆盖原值怎么做:最初设定一个gap,eg:gap等于3,当数组的key里面有值的时候,在数组中向后寻找一个gap间隔,若为空,则放入,若不为空则再向后寻找一个gap间隔
*Tcp和udp的区别及应用场景:*tcp是面向连接的并且是一种可靠连接,通信双方要先建立一个TCP连接,建立连接需要经过三次握手,握手成功后才可以进行通信。传输效率慢。Udp是一种面向无连接的,且不可靠的协议,再通信过程中,只要目标地址、端口号、源地址、端口号确定了就可以直接发送信息报文。它仅仅提供一个校验机制来确保一个报文是否完整,若校验失败,则直接丢弃报文,不做任何处理。传输效率快。Tcp的应用场景:文件传输、接收邮件(要求速度不一定很快但是要保证完整),udp的应用场景:qq聊天、在线视频、网络语音电话(注意不是日常中的打电话)、广播通信。

Tcp如何保证可靠连接:
1.校验和
发送的数据包的二进制取反相加,若为0则无误。目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段
2.确认应答和序列号
序列号:tcp传输时将每个字节的数据都进行了编号,这就是序列号。
确认应答:tcp传输过程中,每次接收方收到数据后,都会对传输放进行应答,也就是回答ACK报文,这个ACK报文有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次从哪里发。有了序列号可以将接收到的数据根据序列号排序,并且可以去掉重复序列号的数据。
3.超时重传:
发送方入没有接收到响应的ACK报文可能有两点原因:
A.数据在传输过程中,由于网络原因全体丢包,对方没有接收到
B.接收方接收到了响应数据,但发送的ACK报文响应最终却因为网络原因丢包了
所以引入超时重传机制 就是发送方在发送完数据后等待一个时间,时间内没有接收到ACK报文,那么刚才发送的数据进行重新发送。这个等待时间(最大超时时间)是动态计算的
4.流量控制 接收端处理不过来发送端的消息的时候,就把滑动窗口缩小,并把窗口值告诉发送端
5.拥塞控制:流量控制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。 拥塞控制方法分为:慢开始、拥塞避免、快重传和快恢复。
TCP引入了慢启动的机制,在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。这时候就引入一个叫做拥塞窗口的概念。发送刚开始定义拥塞窗口为 1,每次收到ACK应答,拥塞窗口加 1。在发送数据之前,首先将拥塞窗口与接收端反馈的窗口大小比对,取较小的值作为实际发送的窗口。拥塞窗口的增长是指数级别的。慢启动的机制只是说明在开始的时候发送的少,发送的慢,但是增长的速度是非常快的。为了控制拥塞窗口的增长,不能使拥塞窗口单纯的加倍,设置一个拥塞窗口的阈值,当拥塞窗口大小超过阈值时,不能再按照指数来增长,而是线性的增长。在慢启动开始的时候,慢启动的阈值等于窗口的最大值,一旦造成网络拥塞,发生超时重传时,慢启动的阈值会为原来的一半(这里的原来指的是发生网络拥塞时拥塞窗口的大小),同时拥塞窗口重置为1。

Git如何解决代码冲突(git代码管理版本仓库):
https://blog.csdn.net/iteye_13700/article/details/82551095

Mysql存储引擎的对比
MyISAM不支持事务,innodb支持事务
MyISAM不支持外键,innodb支持外键
Myisam是表锁,innodb是行锁
Myisam可以没有主键,innodb必须有主键
Myisam是非聚集索引,也是使用B+Tree为索引结果普,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。主键索引和辅助索引的叶子节点都是数据文件的地址。
Innodb的B+Tree是聚集索引。主键索引叶子节点就是数据文件,辅助索引的叶子节点是主键的值。
Innodb为什么推荐使用自增ID作为主键?
自增ID可以保证每次插入时B+索引时从右边扩展的,可以避免B+树频繁的合并和分裂。如果使用UUID会使得数据随机插入,效率很差

存储索引:B+树
简单介绍一下B树B+树:
B树:关键字集合分布在整棵树中;任何一个关键在出现且出现在一个节点中;搜索有可能在非叶子节点结束,其搜索性能等价于在关键字全集内做了一次二分查找。

*B+树:*有n颗子树的非叶子节点含有n个关键字(b树是n个),这些关键字不保存数据,只用来做索引,所有数据都保存在叶子节点;所有非叶子节点可以看成是索引部分,节点中仅含子树的最大或最小的关键字;同一个树会在不同节点中重复出现,根节点的最大元素就是B+树的最大元素。

为什么B+树要这样设计?
这个跟它的使用场景有关,B+树在数据库的索引中用得比较多,数据库中select数据,不一定只选一条,很多时候会选中多条,比如按照id进行排序后选100条。如果是多条的话,B树需要做局部的中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。
然后就手撕算法:
奇数升序偶数降序的数组 将其按从小到大排序为单项链表:
思路:将奇数项和偶数向分别拿出来 将偶数项正序 然后将两个数组采用归并的方式排到数组中。

总结:头条对实习生还好面的不是很难,比较注重计算机基础,面试官真的是天使(不知道是不是因为面试回访的原因),整个面试过程还是非常愉快的即使我有很多不会,通过这次面试也学会了很多,算法题很简单但是当时也很慌思路就很乱,面试官耐心引导了最后代码也写的太乱了面试官没看时间到了(55分钟左右)面试结束,挂!
字节的面试官都可温柔!大家别怕!投!

你可能感兴趣的:(感)