一面
聊项目,项目里用到一个开源路由软件quagga,问我和传统路由软件(华为)的区别;
项目开发遇到的难点、项目开发过程等等;
写题目,给定字符串s1,s2,target,判断target是否是s1、s2的交错组成,比如s1 = “abcd”, s2 = “efgh”, target = “aebfghcd”,target中字符由s1和s2中字符构成,并且s1/s2中字符在target中保持原来的顺序。
上来就想到了归并排序的merge思路,只要按顺序看target是否是s1/s2的merge就行了,比如target第一个字符a和s1第一个字符a相同,就比较s1剩余的部分/s2以及target剩余部分,否则比较s1/s2剩余的部分以及target剩余部分,case通过率40%
发现问题,s1 = “abc”, s2 = “aef”, target = “aefabc”,如果第一个a和s1的a匹配,那么target剩余的部分无法和s1剩余部分以及s2匹配,然而如果第一个a和s2的a匹配,则能匹配成功,因此遇到相同字符时两种情况都要考虑。
但是已经来不及改了,还被面试官吐槽直接把逻辑写到main函数中,写算法的坏习惯。。。
面试完重新写了, AC,下面是编辑器重新写的,可能会有错误。
二面
二面的面试官非常友好,整个面试下来体验不错。
自我介绍,介绍简历上2个项目;
C++11 特性介绍;
右值引用和移动语义;
智能指针;
写参数是指针的模板函数;
template
void func(T* p) {}
linux网络指令,losf/netstat/tcpdump;
TCP/UDP,一揽子问题 + 应用场景;
进程间通信的几种方式,大概介绍;
算法题,给定一个数src,一个目标数target,每个数每次可以加上自己的因数(除1和本身)跳到下一个数,问src最少用几次跳到target,比如4->24,最短路径长度是5(4->6->8->12->18->24,最短路径可能不知一条),动态规划,面试官提示了思路完成。
提问环节,介绍部门所用技术栈,面试官讲的非常详细,游戏中台搭建相关内容,云原生技术等等。
三面
问的问题十分全面,但相对而言比较基础。
手写算法题,2道,都是剑指offer原题
1.随机链表复制,每个链表有一个随机指向的指针rand。直接照书上思路写的话比较麻烦,需要先复制每个节点插到原来节点后面,而后确定新节点指针指向,最后将新节点分离出来做成新的链表。
于是我用的map来代替,原节点为key映射到复制后的节点,代码如下:
2.顺时针打印矩阵,借鉴左程云《程序员面试指南》上的写法,清晰易懂
select/epoll/poll区别以及使用注意点;
线程和进程;
100亿个访问某网站的用户id,统计出现次数最多的10个用户,老生常谈大数问题;
shell脚本写找出一个文件中出现次数最多的10个用户id,我把出现次数前10的次数显示了出来。。面试官看命令没啥问题就过了。
sort | uniq -c | awk ‘print $1’ | sort -rn | head -10
问了对docker底层原理的理解。答了底层的命名空间隔离技术,network namespace以及与传统虚拟化技术的区别。
非常基础的记不太清了,后续有补充会更新。
大概隔了一周接到offer call和正式邮件,由于已经接受了鹅厂的offer,没有接受这个offer,希望以后有机会能去字节学习工作。
目前已经写了腾讯和字节的面经,后续会继续更新百度、网易、网易雷火(均已offer),华为(流程中),阿里微软(挂)的面经,也算作对春招的一次认真总结,希望对大家有所帮助。

1.tcp三次握手和四次握手?
2.jvm的垃圾收集机制?
3.什么时候进行垃圾收集?
4.varchar了解吗?(数据库)
5.8大排序算法?主要问了快速排序,最坏的情况什么的?
6.leetcode算法题,给一个数组,找到三个数不重复相加和为0?
一面
自我介绍
final、finalize()的区别,简单说说吧
static 关键字的用处和注意点是?
String类为何是final修饰的?说说它的底层数据结构吧
String、StringBuilder、StringBuffer有了解嘛?说说你对他们的理解
transient有什么作用?
红黑树的数据结构,左旋和右旋是怎样实现的?
HashMap一定用过吧?给我讲讲它的底层数据结构吧?HashTable与HashMap的区别是?
HashMap的扩容机制、详细说说put元素的过程吧
Node的数据结构是?
寻址算法是?
hashcode是对象原来的值吗?
为何散列表的长度是2的次方数?它的底层算法是怎样的?给我手写一下吧。
扩容的时候,Map中的元素是怎样分配到新的散列表中的?(面试官提示:红黑树中还维护着链表)
HashMap的负载因子为何默认为0.75?
什么是JVM?
JVM的运行时数据是怎样的?
什么是JVM的堆内存?
JVM的垃圾回收算法,讲讲你了解的垃圾回收器吧
有了解G1吗?
看你的项目中用了MySQL,说说MySQL的底层索引是什么数据结构吧?
在你的项目中,使用数据库的存储过程编程,有一定性能提升,能解释下为什么吗?
MySQL的隔离级别
什么是数据库事务?谈谈你对它的理解
MySQL的默认存储引擎是?
MySQL中存储引擎InnoDB和MyISAM的区别
进程和线程,说说理解
CPU如何进行进程间的通信的?
线程的生命周期
什么是线程的上下文切换?
sleep()和wait()的区别
synchronized 和 volatile 有了解吗?
synchronized 是重量级锁吗?
锁升级详细说说吧
那操作系统是如何实现临界区资源访问的同步的?
CAS原理是啥?
volatile 原理和作用
做2个题吧
翻转二叉树
顺时针打印数组
二面
自我介绍
看你这个项目中,用到过MySQL,说说什么是“聚簇索引”吧
你在这个开发小组中担任组长,那说说你在开发中遇到的问题
项目可以演示吗?
一些关于项目的问题,都挺简单(比如为何选择Spring Boot作为开发框架等)
我再看看你的简历吧

JVM中的堆内存是什么?
JVM的垃圾回收算法和常见的垃圾回收器你知道哪些?
Serial
ParNew
Parallel Scavenge
CMS
G1
ZGC
三种垃圾回收算法的区别
强、软、弱、虚引用了解吗?
JVM的类加载机制是?
对象的访问定位有几种方式?
双亲委派模式知道吗?
ArrayList、LinkedList和Vector的异同以及底层数据结构是?
== 与 equals
序列化如何实现?为啥要实现序列化?
什么是JDBC?
int 和 Integer的关系?什么情况下Integer会创建一个新的对象?
反射有了解吗?说说看
死锁是?
线程的sleep()和yield()的区别
synchronized 的用法以及锁优化
什么是Huffman树?主要用途是?什么情况下压缩效率高?
B树和B+树有了解吗?
做2个题吧
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

二叉树展开为链表

三面
没有自我介绍
说说MySQL的索引吧
数据库事务的4大特性
MySQL的InnoDB和MyISAM的锁机制异同,谈谈
数据库SQL语句编写(一个题)
什么是读写分离?
JVM 的堆内存结构是?
详细介绍一下Java虚拟机栈
JVM 垃圾收集器有哪些?
CMS的执行过程是?
STW(STOP THE WORLD)是什么?是如何实现的(两种方式)?
对象的内存分配机制是?
了解过类加载器吗?
TreeMap了解吗?它的底层数据结构是?
平衡二叉树
B树、B+树、B*树有了解吧?简单说说你对他们的理解
什么是线程安全?
举例说明volatile的作用
DCL
ThreadLocal有了解吗?
做题吧
搜索旋转排序数组
正则表达式匹配

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

前言
双非渣硕,本以为简历都过不了…,还好字节能给一次机会。前阵子字节跳动的提前批开始了,看宣传是说有海量HC,机会多多,本着涨涨面经的心理,然后就投递了一下杭州那边的Data部门,首先在这里还要非常感谢内推我的小哥哥,非常热心的帮我跟踪进度,因为中间还出了一些小插曲(我投错部门了。。。),还是热心的小哥哥帮我联系HR,最后把我转到想要投递的部门了~
面试项目大部分问题是围绕我的开源项目 蘑菇博客 展开的,还有就是我之前为了面试突击,记录的一些 学习笔记(大佬请轻喷…),感兴趣的小伙伴欢迎star支持一下~

面试时间
HR面完后,等了一个礼拜多,以为凉凉了,没想到收到惊喜,许愿成功~

6月28日:第一面 + 第二面
6月30日:第三面 + HR面
7月7日:意向书

第一面
第一面我觉得应该是基础面,重点考察的是自己技术的广度 和一些技术的掌握情况,一面小哥哥也没有深究于某个特定的点,面试时间大约1个小时。

自我介绍

怎么打算投递后台岗位的,没有考虑契合自己研究方向的工作

有了解过OAuth2.0么,说说你对OAuth2.0的理解

蘑菇博客开发过程中,有了解或学习其它的开源框架么

蘑菇博客文章发布的流程是怎么样的,是多人博客系统么

对其它的一些博客框架有了解么,比如hexo

hexo和蘑菇博客相比有什么区别呢?蘑菇博客多了哪些功能和优势

看你蘑菇博客用到了RabbitMQ,那谈谈为什么引入RabbitMQ?

RabbitMQ和其它消息队列,比如ActiveMQ,RocketMQ,Kafka有什么区别

Redis在你博客项目中的使用,为什么引入Redis?

Redis中存储的是热门文章,是通过什么来得到的?这样做会有什么问题么?

有听过长尾效应么?你通过推荐字段设置的推荐等级,这样会让这些文章一直保持在较高的点击量,而且热度和点击量也不会随着时间而降低,有什么解决方案么?

我看到你有用到JustAuth这个登录授权?说说它会存在账号泄漏的问题么?

下面谈谈Redis,它会存在线程切换的问题么?

谈谈Redis单线程模型和IO多路复用

Redis的大Key的问题,如果有个Value的大小是2M,会有什么问题么?最大支持的Value大小是多少?

谈谈Redis集群 Redis Cluster,以及主从复制原理?

说说Redis中的哨兵,即Redis Sentinel

下面来聊聊Linux,你知道Linux怎么查看当前的负载情况么?

你还知道其它的一些Linux命令么?

cat、tail、vi、vim命令的区别,分别说一说?

如果Linux下需要打开或者查看大文件,你会怎么做?

下面聊聊Http Code,你知道 3XX 状态码 对应的是什么?

在谈谈你知道的其它一些状态码,4XX 和 5XX?

下面我们来做个题目吧?语言任意,选择喜欢的(ps:其实是leetCode原题,没有做过类似的,想了几分钟没有思路,哭。。,想问问思路,然后说换一题吧,那就,事后想想还挺简单的,根据第一位排序一下就好了)

给定一些数组,例如下面的格式,他们都表示一个区间,然后你需要将区间进行合并
[1,2],[2,4],[3,7],[8,11]
# 如上所示, [1,2] 和 [2,4] = [1,4]
# 然后 [1,4] 和 [3,7] = [1,7]
# 最后 [1,7] 和 [8,11] 无法合并,所以最后结果应该返回 [1,7],[8,11]
那就换个题目吧,看看下面这个题目,找数组出现次数最多的TOP N,回头听室友说,好像又是leetcode原题,泪目,算法能力太弱,没怎么刷题。
# 给定一个数组,例如 [1,1,2,2,2,3,3,3,3]这样的,里面的数组不一定连续并且有序,假设我输入 2,这个2表示出现次数最高的两个
# 那么你需要给我返回 2,3
然后我最开始的思路就是,通过hash存储出现的次数,然后key就是数组中出现的值。最后在对hash中的次数进行排序,最后得到top N,因为时间复杂度是O(N^2),问有没有优化思路,能否优化到O(N),想了半天没有想出来,没有充分运用已经构建好的hash表

后面面试官给讲了一下思路。最后我们一次遍历,已经得到这样一个hash表

key:数组中的值,value:出现的次数
map = {
1: 2
2: 3
3: 4
}
# 因为说过出现的次数是不会有相同的,所以可以翻转hash,也就是把原来的key作为value,value作为key
tmpMap = {
2: 1,
3: 2,
4: 3
}
# 然后因为数组的出现次数最多是 len(array),也就是数组的长度,那么我们只需要从长度最高的去遍历,然后从hash中取,如果能取到,表明就是最多的
count = 0
ret = []
for i in range(len(array), 0, -1):
if tmpMap.get(i):
ret.append(tmpMap.get(i))
count += 1
if count > 2:
return ret
反问环节,问了问面试的表现,被告知算法能力比较薄弱,以为就此凉凉。。。然后一面说这边可以让你进入下一环节,这边大概需要等5到10分钟左右
第二面
二面考察的是技术深度面试,面试时间大约50分钟左右

自我介绍
博客已经开源了么,用的什么开源协议,博客的用户多么?
看你博客中用到了Solr和ElasticSearch,谈谈它们的原理,以及倒排索引?
对于Solr或者ES里面用到的一些中文分词器有了解过么?
谈谈那些技术栈,你比较熟悉的是那些,mysql 和redis?
聊聊MySQL的底层索引结构,InnoDB里面的B+Tree?
B Tree 和 B+ Tree的区别
聊聊MySQL索引的发展过程?是一来就是B+Tree的么?从 没有索引、hash、二叉排序树、AVL树、B树、B+树 聊。
谈谈MySQL里面的事务,说说什么是事务?
MySQL里面有那些事务级别,并且不同的事务级别会出现什么问题?
谈谈可重复读和幻读的区别?
MySQL中如果使用like进行模糊匹配的时候,是否会使用索引?一定不会用么?(索引这块了解的太少了,二面结束后,回去恶补了一下)
谈谈Redis吧,在你项目中的具体使用?
谈谈Redis如何实现分布式锁?
蘑菇博客是否存在缓存不一致的情况,你是如何解决的?
谈谈Redis中缓存穿透的问题,以及解决的方法?
还有其它解决缓存穿透的方法么?布隆过滤器有了解过么?
Redis中大面积的缓存失效,然后请求全部打到数据库,有什么解决方法?
如果出现一些热点数据,比如明星之间的新闻,造成大量的吃瓜用户涌入后台,但是服务器还没有缓存对应的数据,这样可能造成数据库宕机,如何避免这样的情况?
聊聊 JVM的组成结构?
谈谈垃圾收集原理?以及垃圾收集算法
复制算法 和 标记整理算法?
为什么不在新生代使用标记整理算法?或者在老年代使用复制算法?
有了解过Volatile么?谈谈你对Volatile的理解
Volatile如何保证可见性的?以及如何实现可见性的机制。
如果大量的使用Volatile存在什么问题?
谈谈操作系统的线程,以及它的状态
线程和进程的区别?
为什么要提出多线程应用,而不是多进程应用呢?
Linux你平时都有用到什么命令呢?
如果我需要查看端口号或者进程号,你会使用什么命令?
谈谈你做的另外一个项目吧?稍微介绍一下
来吧,写个题目试试
# 链表的两两翻转
# 给定链表: 1->2->3->4->5->6->7
# 返回结果: 2->1->4->3->6->5->7
毕业时间是什么时候?现在面试的是实习岗位么?
反问环节:追问面试表现?告知 Redis这块掌握的还可以,但是MySQL这块显得不足。问后续的安排。
第三面
应该是Leader面,面试时间大概50分钟
自我介绍
好奇一下,用码云的人应该不多吧,为什么没有用Github?
你英文水平怎么样?
聊聊开源项目吧?我看这项目已经有800多赞了,你在这开源项目主要做了什么工作?
我们找些点来聊聊吧?先从ES和Solr开始,你们这两个都有在用么?
SQL的方式实现搜索,你是怎么做的呢?
使用like匹配的时候,会不会查询非常慢呢?
ES和Solr的底层都用了lunce,谈谈你对lunce的理解?
lunce里面也有用到分词器,比如一些新的词 “新冠肺炎” ,它能不能做到很好的划分呢?
除了人为的维护词库,来解决最新词语的分割,你还有知道其它什么更好的方法么?
你有了解过其它什么开源的分词库么?
谈谈字典树?
Solr 和 ES底层都用了Lunce,那他们两者有什么区别呢?
Solr所谓的集群环境 和 ES所谓的分布式环境,它们之间有什么区别呢?
上面你有提到微服务,你有了解过微服务是个什么样的理念么?
你现在的微服务,也是打包成多个jar包,部署在一个服务器上,如果服务器出现问题了,也会造成服务不可用,有没有好的解决方法呢?
聊聊服务的注册与发现?
服务的注册和发现,其实依赖于一个注册中心的概念,会不会出现注册中心挂掉,而导致整个服务不可用,有没有什么好的解决方法呢?
有了解过Zookeeper整个的选举过程么?
谈谈Zookeeper的分布式一致性协议?
聊聊索引,我给你写个表,看看下面的查询语句,走了那些索引?
create table ‘tb’ (
id int,
name varchar(64),
status int,
createtime timestamp,
PRIMARY KEY (id)
)

— 创建了三个普通索引
create index index_name on table(‘name’)
create index index_status on table(‘status’)
create index index_createtime on table(‘createtime’)
— 给定SQL语句,判断下面查询会用到几个索引
select * from tb where status = 1 and name = “zhangsan”
上述SQL用到了几个索引?分别是那几个?
有了解过InnoDB底层的索引结构么?
通过两个索引查询出来的结果,会进行什么要的操作?交集,并集?
如果你在MySQL中遇到一些慢查询,有什么解决方法么?
谈谈explain?执行的explain后,出现的那些字段,能够帮助我们呢?
我看你的博客里面,关于Redis还有好几篇文章,我们可以聊一聊你对Redis的理解?
为什么Redis能够保持这么高的并发响应?
有了解过IO多路复用技术是个什么样的原理
通过一个线程,同时连接多个线程不会存在多个线程切换么?(感觉进坑了。。)
当你通过jedis进行连接redis的时候,已经和一个进程连接了 ,redis还能够和其它的进程进行通信么?
Redis每秒能够处理处理十万请求,如果按照你上面说的,那说明它每次交互只在 1/十万 秒内完成?
有了解过Redis的源码么?
MySQL用了B+Tree,Redis中的SortSet内部用了跳跃表,他们之间有什么差别?为什么MySQL不用跳跃表,或者是Redis不用B+Tree呢?
感觉自己编码功底怎么样?那我们先聊聊操作系统的知识在给你一道题吧。在操作系统中,有高速缓存,主存,虚拟内存,外存,有知道它们之间有什么样的关系,以及它们的作用是啥?
对它们来说,肯定会存在一个问题,就是当我们的主存满了,或者虚存满了,那么需要存在一个换页操作,你知道有那些换页算法么?
我们来聊聊LRU?叫你手写一个LRU算法谈谈你的思路?
用链表的方式实现,时间复杂度是O(N),有没有什么方式能够让它是O(1)的时间复杂度呢?
OK,思路还可以,那你手写一个LRU算法吧?(双向链表 + Hash?)
反问环节:问了下组织架构,已经python和go在项目中的使用。然后问了下面试的表现,得:代码写的不算好吧,LRU写成这样我觉得是不太合适的。(心碎的声音,感觉到凉凉的气息…),结束后以为面试已经结束,后面在准备关页面的时候,面试官说等一下,还有同学和我聊?
HR面
花10来分钟做个简单的沟通

自我介绍
考研的时候为什么选择的是这个学校呢?
回顾一下,上大学到现在这段时间内,让自己最有挫败感的事情是什么呢?
有那些方面需要在改进的么?
回顾一下,上大学到现在这段时间内,让自己最有成就感的是什么事情呢?
对毕业工作的地点是有什么想法?
校招也陆陆续续开始了,在面试流程中的公司还有那些么?
对于以后参加的工作,你主要会看重那些方面呢?
毕业时间?
同学这块,大家都有在投递字节这边的岗位么?
反问环节:关于面试结果,告知,这边只是做简单的了解,面试结果大约会在一周左右出来,到时候会有邮件或者电话通知。关于面试的结果,需要综合前面的几个面试官进行综合评测,才能决定是否录取。
总结
字节跳动总体来说,面试体验还很不错的,尤其是在手撕代码题的时候,面试老哥会先叫你提供思路,如果你说的思路有问题的话,会帮你拨正,然后在进入coding阶段,但是怎奈何平时没怎么练习算法,leetcode做的少,面试两行泪。。这也算是提前批打响第一枪,期待后面精彩表现~
一面
开头没有自我介绍,直接开始问项目了,问了比如

常用的 Web 组件有哪些
(回答了自己经常用到的 SpringBoot,Redis,Mysql 等等,字节这边基本没有用 Java的后台,所以感觉面试官不大会问 Spring,Java 这些东西,反倒是对数据库和中间件比较感兴趣)
Kafka 相关,如何保证不会重复消费,Kafka 消费组结构等等(这个只是凭着感觉和面试官说了,因为 Kafka自己确实准备得不充分,但是心态稳住了)
Mysql 索引,B+树(必考嗷同学们)
还有一些项目中的细节,这些因人而异,就不放上来了,提示一点就是要在项目中介绍一些亮眼的地方,比如用了什么牛逼的数据结构,架构上有什么特点,并发量大小还有怎么去 hold 住并发量

后面就是算法题了,一共做了两道:

判断平衡二叉树(这道题总体来说并不难,但是面试官在中间穿插了垃圾回收的知识,这就很难受了,具体的就是大家要判断一下对象在什么时候会回收,可达性分析什么时候对这个对象来说是不可达的,还有在递归函数中内存如何变化,这个是让我们来对这个函数进行执行过程的建模,只看栈帧大小变化的话,应该有是两个峰值,中间会有抖动的情况)
二分查找法的变种题,给定target和一个升序的数组,寻找下一个比数组大的数.这道题也不难,靠大家对二分查找法的熟悉程度,当然,这边还有一个优化的点,可以看看我的博客找找灵感
完成了之后,面试官让我等一会有二面,大概 10 分钟左右吧,休息了一会就继续了

二面
二面一上来就是先让我自我介绍,当然还是同样的套路,同样的香脆
然后问了我一些关于 Redis 的问题,比如 zset 的实现(跳表,这个高频) ,键的过期策略,持久化等等,这些在大多数 Redis 的介绍中都可以找到,就不细说了
还有一些数据结构的问题,比如说问了哈希表是什么,给面试官详细说了一下java.util.HashMap是怎么实现(当然里面就穿插着红黑树了,多看看红黑树是有什么特点之类的)的,包括说为什么要用链地址法来避免冲突,探测法有哪些,链地址法和探测法的优劣对比
后面还跟我讨论了很久的项目,所以说大家的项目一定要做好,要有亮点的地方,在这里跟面试官讨论了很多项目优化的地方,还有什么不足,还有什么地方可以新增功能等等,同样不细说了
一边讨论的时候噼里啪啦敲了很多,应该是对个人的面试评价一类的
后面就是字节的传统艺能手撕算法了,一共做了三道
一二道是连在一起的.给定一个规则S_0 = {1} S_1={1,2,1} S_2 = {1,2,1,3,1,2,1} S_n={S_n-1 , n + 1, S_n-1}.第一个问题是他们的个数有什么关系(1 3 7 15… 2 的 n次方-1,用位运算解决).第二个问题是给定数组个数下标 n 和索引 k,让我们求出 S_n(k)所指的数,假如S_2(2)=1,我在做的时候没有什么好的思路,如果有的话大家可以分享一下
第三道是下一个排列:https://leetcode-cn.com/problems/next-permutation的题型,不过做了一些修改,数组大小10000hr 面
一些偏职业规划的话题了,实习时间,项目经历,实习经历这些。
总结
基础很重要!这次准备到的 Redis,Mysql,JVM 原理等等都有问到了,(网络这一块没问,但是也是要好好准备的,对于后台来说,网络知识不仅仅是面试,还是以后工作的知识基础).当然自己也有准备不足的地方,比如 Kafka 等中间件,只会用不会原理是万万不行的.并且这些基础知识不能只靠背,面试官还会融合在项目里面进行串问
问到了不会的不要慌,因为面试官是在试探你的技术深度,有可能会针对某一个问题,问到你不会为止,所以你出现不会的问题是很正常的,心态把控住就行.
无论是做题,还是回答问题的时候,牢记你不是在考试,而是在交流,和面试官有互动和沟通是很重要的,你说的一些疏漏的地方,如果你及时跟面试官反馈,还是可以补救一下的
最重要的一点字节的面试就是算法一定要牢固,每一轮都会有手撕算法的,这个不用想,LeetCode+剑指 Offer 走起来就对了,心态很重要,算法题不一定都是你会的,要有一定的心理准备,遇到难题可以先冷静分析一波.而且写出Bug free的代码也是很重要的,我前面的几题算法因为在牛客网上进行面试,所以要运行出来.
平衡二叉树:每一个节点的左子树和右子树高度绝对值最多为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分钟左右)面试结束,挂!
字节的面试官都可温柔!大家别怕!投!
————————————————
版权声明:本文为CSDN博主「cool_and_gentle」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cool_and_gentle/article/details/102827755

笔试结束3天一面,视频面的。
一上来写一个算法题,给一个无序数组,找一个分割点,使得分割点左边的所有数小于等于右边所有数,分割点要求尽可能小。
这个题我写了个O(n)的时间复杂度,中途写出bug,差点翻车。。。
然后就问基础:
1.先问在地址栏数baidu.com访问百度首页,涉及哪些协议。
2.我说到个https,他就问https中,客户端和服务器交换密钥的过程。(面试前一天才看过,不然答不出来。。)
3.讲一下操作系统内存管理机制(给他讲了下页式管理之类的)
3.http报文header和body的分隔符是什么,怎么判断http报文结束。
4.写过什么多线程的程序?我说以前学java上课写过那种窗口卖票的,他就问多线程是怎么避免冲突的
5.java和c++哪种语言好,为什么
6.网络怎么分层的
7.服务器怎么生成sessionID,我说我不知道,他就问如果让你设计一个生成sessionID的算法,需要考虑什么问题
8.客户端访第二次访问服务器是怎么找到自己的session的
9.用户上传了文件,之后又上传了内容完全一样的文件,怎么判断新上传的文件和旧文件一样
10.还有些问题,时间隔久了,想不起来了。。。(反正都是网络,操作系统的基础,只要基础稍微好点,问题不大)

1、找一个你的项目说一下,首先你的项目介绍,承担了什么职责,做了哪些工作,难点
因人而异,这就不在赘述了,balabal……(省略三分钟)
2、从你项目中看出,你使用的是mysql,mysql的int数据类型都有哪些?从小到大说一下,各占多少字节?
当时就记得tinyint和int,字节是1字节(tinyint:1,smallint:2,mediumint:3,int:4,bigint:8)
3、java中的int都有哪些?字节占多少
short,int,long,分别是:2,4,8
4、问你一个关于计算机网络的,tcp的三次握手说一下?
三次握手的话,客户端首先发起建立连接的请求,发送syn和seq,seq的话就是一个临时交互号,是自身的一个标识;之后第二次握手就是服务端收到请求后会发送一个syn,seq自身的标识,ack客户端seq+1;第三次就是客户端收到回应后发送syn和seq和sck。三次握手过程中分别进入的状态是:syn_send,syn_recv,established
5、tcp和udp的区别
tcp和udp他们都是传输层的协议;然后tcp是可靠传输,udp是尽最大努力交付,不可靠;tcp主要应用于端到端的比如电话这种服务,udp应用于广播,收音机等服务;tcp头部含有更多的如目标地址等信息,比udp头部开销更大。
6、你说你熟悉linux,我给你一个案例,搜索出log文本中出现次数最多的IP,并且给出次数
我直说了我不会,我linux是用来当操作系统进行日常开发使用,没有深入探索。面试官也没有追究
7、说下java的gc
现在是分代收集方式,首先进行垃圾对象的判断,判断的话有两种方法:引用计数和可达性分析,
引用计数就是没有一处引用了该对象就计数+1,当计数器为0时,代表没有地方引用他,可以回收,但是没法解决循环引用问题,现在主流虚拟机都不用这种办法。
可达性分析是选了一些对象作为GCROOTS,当从gcroots出发没有引用线时可回收。
垃圾回收的话就是有三种,标记清除,标记整理,复制算法。

8、说一下hashmap这个数据结构
他现在的实现方式是数组+链表+红黑树,通过计算hash,将对象存进hashmap中,当链表的长度大于8,链表进化为红黑树,链表小于6,红黑树退化为链表,这样能防止频繁的进行红黑树的转化,然后红黑树的话通过着色和旋转进行自平衡。

9、进行一次查找的话haspmap的时间复杂度是多少
O(1),这个是作为数组的查询复杂度。

10、给你一个算法你看一下,有一个无限长的整型数组,从小到大排序,非递增。那么怎么找到数组中一个key
初始想到的是使用二分,然后我说从n/2的地方进行二分,面试官说那也是无限啊,
我想了想说用双指针,一个以2为步长,一个以1为步长,然后当快的指针大于key时,往回遍历,
然后说完就想到不需要两个指针,一个指针即可,记录步长,一定再超出当前值的位置和当前位置-步长的范围内。面试官又问你步长怎么选?
我说可以模仿计算机网络的慢开始,第一次步长为2,第二次步长为4,第三次为8,持续为2的幂次,大于key时,再在当前位置和当前位置-步长范围内查找。
面试官问时间复杂度多少?我说不上来,尴尬,面试官提示后说是O(logn)

闲聊
之后就问了我最近看了哪本书,学到了什么,最近还在学的什么技术呢?问了我职业规划,兴趣爱好,还说了说公司的语言选型,我后来问了下对于我的面试表现评价,人家不方便说,又问了新人培养等问题。

字节跳动二面
中间断了两次网,好尴尬
自我介绍
然后说一说mysql的索引结构吧
mysql的索引结构是b+树,然后b+树我觉得相对于b树来说优点在于他非叶子节点不存储数据,本身每个节点的空间是有限的,这样的话他每个节点能存储的节点数就更多,层级就更低。
然后因为它非叶子节点不存储数据,这样每次查询是一定要到叶子节点,查询就更稳定
然后还有就是它叶子节点是单链表连接的,这样天然有序。

看一道题吧,这个题怎么建立索引
mysql
订单表有几个属性:订单id,用户user_id、下单日期date(精确到天)等,请问索引怎样建立
a. 查询某个用户的所有订单
b. 查询某一天的所有订单
c. 查询某一天某个用户的所有订单
综合考虑三个场景,建立尽量少的索引。

建立两个索引
第一个是日期索引,
因为b要求查询某一天
第二个是组合索引,用户user_id,订单id,下单日期date
因为c用到了三个,同时在建立索引时,将三个都建立上,另外由于索引结构中,int类型最佳,其次是date,所以将date放在后面。

看第二道题
10G文件,每一行一个 uint32 数字。有一台1G内存的机器
- A. 找出最大的 k 个数
- B. 找出重复数字

A:
使用堆排序,这里不是对所有的10G数据建堆,而是建立一个k大小的空堆,然后遍历数据,有大于根结点的值将堆根节点替换上,并调整大顶堆
B:
这里建立10G长度的hash表是不行的,内存不够,建立一个小的1000的hash表,遍历数据,求hash值,当发生hash冲突时,往前遍历,只需要往前遍历,查找是否存在重复值

第三道题
我手中有一堆扑克牌, 但是观众不知道它的顺序。
第一步, 我从牌顶拿出一张牌, 放到桌子上。
第二步, 我从牌顶再拿一张牌, 放在手上牌的底部。
第三步, 重复第一/二步的操作, 直到我手中所有的牌都放到了桌子上。
最后, 观众可以看到桌子上牌的顺序是:13\12\11\10\9\8\7\6\5\4\3\2\1 请问, 我刚开始拿在手里的牌的顺序是什么?

代码实现一下吧

字节跳动三面
这个面试官应该是一个总监级别的,说话非常的硬气,肯定是一个资深大佬,一共面了40多分钟。常规的面试基础都没问,纯怼项目和算法了。
1. 自我介绍
2. 你觉得你目前遇到的困难有哪些?项目上的难点?
3. 你的项目数据库多大?QPS多少?哪些sql比较慢?
4. 那你觉得以后qps更大的话,你该怎么设计?
热点数据加缓存。
5.给你一个算法题,你来看一下思路
给定一个应该包含全部int32整数的文件,里边可能缺失了若干数字, 返回任意一个确认缺失的数字。
首先问我int32在内存中占了多少内存?我没答出来,这换算不知道怎么算,我就想着32,,8个字节啥的了
实现的话我想了一下,首先想到hashmap,然后说了后他问我怎么实现,时间复杂度多少?空间复杂度多少?我想了想觉得不行,然后我就说hashmap不存放全部数据,定一个假设是100的hashmap(其实这里已经没有hashmap的意义了,换数组也是可以的)然后所有数对100求模,如果求得的模比100大,那么继续求,此时就是0,100,10000,1000000求得的模是一样的,最终就计算个数是不是正确如果不正确再去查找该不正确序列里那个数不存在。
然后他说那你用代码实现一下吧
过了好久我还没写完,他说时间差不多了我看你也写的差不多了,那就先这样,然后我就赶紧给他讲了讲我的代码,告诉他接下来我会怎么做也就是差不多出来了(现在暂时不想整理了,先这样)
那留两分钟咱们聊一聊,你有什么想问我的

面试结果确实是凉了,准备秋招正式批中。
这里后来反思了终面算法题,这里作为补充:
给定一个应该包含全部int32整数的文件,里边可能缺失了若干数字, 返回任意一个确认缺失的数字。 这个文件占多大内存?
先说第二问,占多大内存:现在想想其实也是能够说出来的,int占4字节,32位,那么就是2^32比特位,换算就是4G。
第一问,解题思路:
后来我看了其实应该使用位示图法。解题思路和位示图法介绍不是面经分享的主题,直说代码:

字节跳动:(面试体验极好)
一面:(55分钟)
没问项目,直接怼简历上的基础知识。

c++
1.虚函数、虚函数表
2.平时用什么工具查看内存泄露
3.出了个题,问有没有内存泄露(不会)
4.static_cast了解吗(不了解)
5.private、protect、public区别

操作系统:
1.用户态、内核态
2.进程线程区别
3.线程的通讯
4.进程的通讯
5.进程怎么共享内存的(不了解)
6.进程线程切换的代价

网络:
1.三次握手、为什么多了第三次
2.四次挥手、多了哪一次、为什么
3.http协议了解吗?(不是很了解)
4.常见的http的状态码
5.http和https的区别
6.tcp怎么保证可靠传输
7.什么是粘包,怎么设计避免粘包
8.get、post了解吗(不了解)

数据结构:
1.二叉树的性质,以及满二叉树多少个节点
2.avl树和红黑树

mysql:
1.b树和b+树
2.什么是联合索引
3.聚簇索引和非聚簇索引
4.mysql的锁
5.innodb和myisam两种引擎的区别
6.悲观锁和乐观锁
7.数据库联合查询
8.出了个索引的题(我说只熟悉理论,实操不会)

设计模式:
1.单例模式
2.介绍单例模式里两种模式的区别

linux命令:
1. linux查看进程所占内存命令
2.怎么查看cpu占有率

算法题:lc112 验证二叉树路径和

二面:(50分钟)
全程怼项目
1.介绍epoll和select区别
2.为什么用LT模式
3.ET模式为什么比LT模式效率高
4.线程池的作用
5.项目是怎么同步互斥的
6.介绍下互斥量
7.如何保证互斥量只有一个的(这个不会)
8.linux关闭终端窗口的过程发生了什么
9.fork创建子进程的过程;
10.下面这段代码最终打印什么
main () {
printf(“xxx”);
fork();
}
11.什么是守护进程
12.怎么创建守护进程、守护进程的区别
13.线程池的线程数怎么确定
14.怎么设计线程池的

场景题:海量日志数据,提取出某日访问百度次数最多的那个IP,以及怎么优化
算法题:合并m个链表,怎么合并,时间复杂度多少(时间复杂度我说错了)
写这个代码
三面:(40分钟)
又是全程怼项目
1.自我介绍
2.详细说下项目
3.进程线程区别
4.为什么考虑多线程,不考虑多进程
5.flood攻击是怎么检测的
6.介绍下心跳包
7.进程的通讯、线程的通讯
8.你这项目是单机的吧,如果是分布式多机,怎么设计你的flood检测(直接表示对分布式不熟,不会)

场景题:
.你有一个日志,里面有用户的登入登出时间,用户id,找到某个用户登录的峰值(直接说了思路)
.好,那么你来写下这个代码
(OMG,当场我就懵逼了,让我写场景题的代码,我想了半天不知道输入的接口参数怎么设置,面试官和我说是三维的,OMG又蒙圈了,明明是一个很简单的的算法,但是不知道接口,迟迟动不了笔,后来面试官就没让我写了)
9.我向一个文件里面写入内容,发生了什么过程。
hr面:(15分钟)
1.介绍自己
2.平常的学习方式
3.学这个多久了
4.打算怎么弥补自己的不足
5.以后打算在哪工作以及目标公司
6.你有什么想问的
7.介绍了我面试的部门的团队,沟通了实习时间,到岗时间,薪资等

感想:

一面面试官是个好看的小姐姐,声音也很温柔,几个因为没了解过答不出来,面试官也说没了解过没关系;
二面面试官,蛮温柔,场景题的时候会引导我。
二面结束之后,我想着,一面问基础,二面问项目,三面应该是基础+项目吧,然后准备了好多天基础,结果全场怼项目,好在我项目也复习了,答得很溜。
三面面试官也挺专业,感觉对我期望很高的样子。

后记:
三面的时候,让我写场景题代码,把我整的整个人都不好,我好歹准备了几百道算法题,结果让我手撕场景题代码,我有种面社招的感觉,但是社招也没怎么考这种啊,然后我没写出来,瞬间感觉凉意,面试完,我整个人都不好了,我以为自己挂了,结果5分钟不到,hr打电话告诉我通过了!!!!!!
真的是开心,然后我琢磨着,整场面试,我答得都非常好,拓展了很多知识,然后那个场景题代码,其实也蛮简单的,我想面试官应该也就打算让我直接过,只不过我不知道接口写不出来,面试官应该感觉到了,然后直接给我出了个简单的问答题,好在,我答得也很好,然后面试官就给了过。感谢ing~

总之:
字节跳动面试下来,发挥的不错,除了个别超出知识边界的问题,其他都答上来了,也拓展了很多。
面试官也很专业,面试体验极好,效率高,都是面试完hr立马电话通知通过了。