已获杭州教育部门提前批意向书,还原牛客
7.20 一二面连在一起一共90min; 7.23 三面45min;7.27获知三面通过;8.7晚get意向书
本科大连理工水利类专业,硕士东北大学计算机专业,无编程竞赛无论文无开源无实习的四无渣渣(有三个数学竞赛)🤣🤣🤣🤣
项目:一个实验室的实时图像处理系统,主要用到了Java并发编程(线程池,生产者消费者,并发容器,同步原语,ThreadLocal等);秒杀系统(只做了登录与缓存模块,MQ都没学🤣)
一面:
1.自我介绍+项目介绍
2.做游戏:给商家y元,你投骰子,最多可投三次,你可以在任意一次选择停止,并采取最后一次的点数x作为你的奖励,问y应该取多少,该游戏才公平
最开始一直想根据获奖期望为0来做,但是半天没写出来。面试官给提示说要是就能投一次y应该是多少,我答3.5。
面试官说不用算结果给一个建模模型就行,问还没什么思路么,我又思考了三分钟,面试官说那下一题吧,然后瞬间开窍给出了下面的式子🤣:
P(x1 > = y) + P(x1 <y && x2 >= y) + P(x1 <y && x2 <y && x3 >= y) = 0.5
y = 4时 p< 0.5 ,y = 5时 p > 0.5 取插值结果
面试官看完说可以,我回去看标准答案确实是按我最开始那种求期望的想法做的(怪自己能力不行🤣),
但回头想想自己给出的模型也没啥问题。
3.手撕算法:求二叉树各层结点的平均值,怎么评价一个算法好坏,你这个算法的复杂度?
层次遍历,复杂度,O(n)O(1)
4. 反问:工作时间分配
上下班不打卡,活干完了爱干啥干啥
二面:
1.自我介绍+项目介绍
2.TCP四次挥手流程
3.按你的说法被动关闭方向主动关闭方发送ACK后还可能传输数据所以不能一块发FIN,那么如果被动断开方不向主动断开方再传数据,四次挥手就能合并为三次挥手吗
这个答案我真不知道,网上也没收到。我当时学的时候就是因为连接处于半关闭状态时,被动关闭方还可能要向主动关闭方发送数据所以才必须挥手四次,至于不发送数据能不能合并我真不知道,
我当时回答的是可以,大家有知道这个答案的可以评论告诉我下
4.TIME_WAIT与CLOSE_WAIT状态
TIME_WAIT说出来了,CLOSE_WAIT当时没答出来
5.TCP VS UDP, 设计一个可靠地UDP怎么做,HTTP状态码,Https握手原理
两者对比没啥好说的
设计可靠UDP没学过,但是我讲了TCP的流量控制和拥塞控制,然后说UDP也可以引入类似的一种确认机制来保证不会发生丢包和乱序,面试官表示还OK
状态码一直也没记那么细,所以当时和面试官说这个我了解不多,我只知道各个数字开头的状态码的语义,他表示那你说一下也可以
Https握手当时不会
6.你在项目中使用了Redis,为什么用Redis缓存?系统目标QPS是多大?在数据库上怎么提高呢?
减少数据库的IO压力,提高系统的并发性
Redis纯的内存型数据库,单线程,非阻塞IO速度快
5000
主从结构读写分离,分库分表,优化索引....
7.缓存了什么呢?
分布式Session,用户信息,订单信息,库存等
8.怎么保证数据不丢失?我要限制一点数据都不能丢应该怎么做?
讲RDB与AOF,可以对AOF进行配置,对每条命令都要同步
9.Redis为什么这么快?
Redis纯的内存型数据库,单线程,非阻塞IO速度快
更详细谈了谈Redis线程模型
10.Redis Zset底层结构及原理?与红黑树区别
跳表概念,核心思想(自己总结的:右下右下找前驱),复杂度,跳表相对于红黑树只有局部调整且简单易实现
11.Redis主从结构了解吗?集群了解吗?讲一下一致性hash
12.非阻塞IO模型都有哪些?
不会....
13.进程通信方式?
7种
14.共享存储区是怎么实现的?
不会....
15.10w个数找第k大的数怎么做?
讲划分
16.10亿个数找第k大的数怎么做?
分治+堆;将这些数分散在小文件,每个小文件都可以载入内存,然后建立容量为k的小顶堆,求各文件topk,在求全局topk
17.100亿个数找第10亿大的数怎么做?
想了半天,说根据上一题的思想,先找一个内存能装下堆容量的topk,比如10万,然后依次剔除数据再去找top10亿
面试官表示复杂度有些高,还有没有别的想法?
想了半天,我问这些数据是不是比较均匀,面试官好像不太理解我问这个对这个题有啥帮助,他就说可以认为在整数域比较均匀
我说可以按位切割,我就讲一下思想,假设这些数是无符号数,按最高位是1或0把数据分为两部分,那为1的集合中的所有数都比为0的集合中的所有数大,
比如第一个集合有40亿个数,第二个集合有60亿个数,那top10亿肯定在第一个集合;之后在对第一个集合中的数按次高位是1or0进行划分.....
讲了半天,面试官表示没太听懂🤣🤣🤣
18.手撕算法:给链表表头和区间[n, m], 反转区间段并返回结果
拆分,翻转第二部分再合并
19.手撕算法:输入串str1与str2,找到str1中包含str2中所有字符的子串的最小长度
滑动窗口
20.反问1:业务与技术
业务不方便说,还处于保密阶段
技术Golang/Python+Web与分布式常用组件,Redis Kafka之类的
21.反问2:评价或建议
网络与OS基础掌握的不够深入....(当时感觉要凉😂)
三小时后告知通过,约了三面
三面
面试官上来先自我介绍了一下,然后让我别紧张(其实我根本不紧张...),问了问我之前两面的情况,对面试官的感觉如何,对自己的表现感觉怎么样,
我当时就实话实说了:面试体验挺好之类的,但二面的时候网络有些基础问题没有答出来;面试官表示那回去有没有补充一下呢,让我看看你现在掌握的怎么样吧🤣
1.三次握手详细带状态讲
c->s:SYN,seq = x, c进入同步已发送
s->c: SYN/ACK, seq=y, ack=x+1, s进入同步已接收
c->s: ACK,ack=y+1,cs进入链接已建立
2.进程通信共享存储区怎么实现的
将一块内存映射到进程的私有地址空间
3.秒杀项目中登录模块怎么实现的
讲了两次MD5与分布式Session实现
4.明文传输吗?salt存在哪里
MD5加密不传输明文,salt当时居然没答出来....(后来回去才想到第一次salt就是静态量,第二次salt存在数据库)
5.缓存模块讲一讲
就说了Redis存了什么以及为什么用Redis存这些数据
6.加缓存了QPS提升的较少,问题出在哪里,怎么证明呢
当时就是跟着慕课网做的,把SpringBoot程序,Redis,MySQL,Jemeter等都放到一台服务器上跑的,当然第一句肯定没说....
7.讲一讲虚拟演播室系统
8.讲一下难点
9.手撕线程安全单例模式
写了DCL
10.Java我不是太懂哈,这里为什么要加volatile这个关键字呢
说了volatile作用及特性,底层实现原理,唠了唠JMM确保缓存一致性及Happens-before
然后说不加volatile,new Sinleton()底层的指令可能重排,对象可能会重复构造
面试官看我讲了这么多(他可能有些部分不太懂)就笑着问我这些东西确定吗?
我很果断说确定啊,因为我看过《Java并发编程的艺术》这本说,说了一堆书上怎么说的和自己的理解
面试官表示很满意😁
11.计算机这些课都是自学的吗?
有一部分是自学的,比如Java,网络与数据库等;跨专业也有必须的补修课比如C++,计组,OS等
12.看你数学成绩很好,并且获得过挺多数学竞赛的奖的,数学好是因为喜欢还是?数学竞赛考的主要是什么?学数学能给你带来哪些提升?
因为我是非科班么,所以只能拿数学成绩来编编简历了(本科高数概率统计满,线代97,辽宁省大学生数学竞赛一等奖,全国数学大学生竞赛一等奖,辽宁省研究生数学建模竞赛二等奖)
瞎扯呗~~~~
13.100个人坐飞机,飞机100个座位,第一个人进去随机坐,从第二个人开始如果自己的座位空闲则肯定坐到自己的位置,否则也会随机坐,问第100个人坐到自己座位的概率是多大?
当时想了一分钟,还思考了如果只有两三个人会怎么样,完全忽视了(从第二个人开始如果自己的座位空闲则肯定坐到自己的位置,否则也会随机坐)这个条件,跟面试官说答案是1/100,然后说因为是全空间就是100!,
然后所求空间就是最后一个人在自己的位置,另外99个人的排列99!,所以结果是99!/100!=1/100(当时我居然还**挺自信?现在想想自己真是个憨憨,面试官当时看着我都笑了,我估计是因为我都把答案给出来了,
而不是没有思路,他连提示也没法给啊~~~~,而且我感觉我回答完这个题之后,他应该怀疑是不是人均可获数学竞赛奖😅)
14.手撕算法:n长数组,0~n-1中重复的数字
1分钟说思路,让证明思路是正确的,3分钟写出了方法,然后就按面试官的测例跑,都AC
15.反问1:部门内的新人成长机制
mentor,dance program,先学两个月然后写简单接口之类的....
16.反问2:如何评价一个人都部门/公司贡献的大小
不同职级有不同标准,肯定不能按代码量来衡量,主要看绩效,然后说了下绩效咋算的....
17.反问3:评价或建议
基础很好,已经可以和科班的打平了(🤣🤣🤣您吹牛*别带上我)
但做过的项目要有更深刻的印象(就是那个salt没答出来,听到这个评价我都觉得我凉了)
三天后得知通过,告知没有HR面,等意向书的过程真难熬
菜鸡的一些建议:
1.字节还真是靠算法和基础就有很大可能进的公司(所以准备的时候多刷题,听内推群主说面试官出题后都会计时的,常规题10min不能bug free就没了)
算法学习:左程云基础与提升班,算法第四版,剑指offer*3,leetcode 100*2,接下来字节面经中的题了(贴下大佬总结的,觉得质量特别高)
基础学习:除了一些公开课外与Cyc大佬的github资料外,简历上写熟悉的知识一定要去看一看经典的书,要能延展出来,而不能直接去背面经,面经的作用主要还是查缺补漏
比如我在简历上其实着重突出的是熟悉Java与数据库方面的知识,所以我就看了:《Java核心技术卷一》(Swing没看,这本书也没有讲容器源码,IO反射动态代理这些原理需要自己补充)
《深入理解JVM》(第四部分没看),《Java并发编程的艺术》,《高性能MySQL》(1,4-11章),《Redis设计与实现》(1-17章)
2.心态与技术同样重要,将面试融入生活。这个其实就因人而异了,有的人就觉得紧张感更能激发自己的潜力吧,实时刻刻地提醒自己秋招或这次面试对自己多么多么重要,心理暗示特别强烈,
这样除非你以前心理素质或表达能力就特别好,否则面试的时候很容易紧张反而发挥不出自己应有的水平。7月份最开始投简历的时候我也保持这种状态,强迫自己不玩游戏不看电影,一天的时间除了学习什么“闲事”也别干,这样下来半个月发现自己不但学习效率没什么提升,而且面试的时候还会特别紧张,整个人一天也处于没什么精力昏昏沉沉的状态。后来索性就白天学习晚上拿出两三个小时要么休息要么玩,不给自己那么大的压力(或者说是弃疗了吧),心态放平和。反而效率特别高,面试的时候也特别的自然放松。所以找到适合自己的学习方式,摆好心态,我觉得是比无效率的学习更重要的(每天能高效学14h以上的战神请离开此贴)。当然我这里的意思就是需要因人而异对学习,心态,面试种种之间做一个权衡罢了,执行起来自律还得靠自己。
#面经##校招##字节跳动##Java工程师#