字节跳动 杭州飞书后端开发提前批 北京教育后端开发

飞书很早就面了,然后一面就挂了......投的java结果一个java没问
后面被北京hr捞了,现在两个都发一下.

飞书-后端开发(6.23)

一面

  1. 讲讲你的项目都是干啥的(用啥语言,用啥数据库,你干啥)

  2. 聊聊redis,问了基本数据类型(我就答了那五个)

  3. 你们项目用redis做什么(只用过springboo简单写两个注解)

  4. redis有序集跟hash的区别(不知道怎么答,一个集合一个map)

  5. 用redis做热度排名选什么类型,没答上来,只说记得有个rangByScore

  6. redis快照(没怎么了解,就随便讲了讲rdb,平常也就dump)

  7. 再讲讲mysql,怎么加快插入速度(不知道)

  8. mysql索引,聚簇 非聚簇区别

  9. 讲讲B+树,聚簇索引B+树里有什么东西(叶子节点存行记录)

  10. 非聚簇B+树有什么东西(叶子节点存指针)

  11. 刚刚提到了页,聊聊操作系统分段 分页

分段大小不定,段的每部分是有意义的,例如代码段,数据段.分页大小固定,但是没有具体意义.然后基本往断页式管理那边靠吧,我有点忘了没答上来.复习的时候建议顺便opt,lru,lfu都复习了

  1. 操作系统线程模型(没听过)

  2. 用户态 内核态区别(只说了权限,面试官还是要追着问,再往后不知道了)

  3. 聊聊信号

就linux的sigint,sigquit那些,我只说了上课讲的C语言编程捕捉信号就不会了.面试官就追问了很多很多,比如信号背后的原理,还要我讲讲中断与信号的关联,估计是提醒我信号实现的原理跟中断有关,可惜我不会

  1. 你发送一个信号,操作系统做了什么,结合中断来说说(接着上面那点问的,不会)

  2. 聊聊网络,如果A向B请求简历TCP,但B没开启服务,是连接超时还是连接失败(没开服务会超时)

  3. 同上,如果B机器坏了,无法开机,是超时还是服务.

无服务,因为ip都没有,可以结合osi模型讲讲,下层会返回icmp报文,好像是不可达,可惜当时我没答上来.当时我说的是Tomcat没开启,你访问localhost:8080会显示404

  1. 做道算法题,找波峰,优化一下到Log(n),用二分.(很经典的题,各大oj网站,搜索引擎搜搜就有了)

总结一下就是硬怼数据库,操作系统,计网,一句java没问.凉的透彻,第二天睡醒就感谢信了.

北京教育后端开发(7.25)

一面

  1. 聊一个你最拿得出手的项目,你干了啥,最大的难点,然后具体针对项目再问问你问题,比如实现某功能的流程.

  2. 用的数据库(mysql),讲讲acid,默认隔离级别(可重复读),幻读是什么,可重复读能防止幻读吗(不能)?

  3. 要你写个sql,再问他的执行过程

我就说一般都是先执行where,这里没有where就先执行group,因为你必须先group才能聚合,但是好像还不够,面试官就换着问:如果你设计sql,你觉得应该怎么执行.可惜忘记了数据库上课讲的那些关系代数和执行引擎这些,可以考虑从这方面回答

Users表结构
columnName | columnType
UserId     | int
UserName   | varchar
City       | varchar

获取人数最多的三个城市名

select City
form Users
group by City
order by count(UserId)
limit 0,3
  1. 问个操作系统,进程通信方式,挑了个共享内存问是咋回事

有七个:有名管道,匿名管道,共享内存,信号,信号量,socket,消息队列.答了五个剩下两个一时半伙记不起面试官说可以了.
多个线程共享一块内存,然后一个线程写其他线程读,特点是快,然后需要自己管理并发,比如用互斥量

  1. 问个网络,TCP和UDP区别(有无连接,是否可靠),TCP怎么确保可靠

讲了滑动窗口,如果窗口前端在3,而5的报文到了,先将5放到缓存.如果3超时了,则要求重传3,4,5

  1. 微信扫码登录端的流程你觉得是怎样?或者你自己开发个扫码功能,你怎么实现

二维码就是信息的载体,你扫描二维码扫描出来一个url,然后用你手机里存储的账户信息去post这个url,微信里就是openId.

接下来是一个难点,扫完码之后怎么通知电脑web端跳转.我回答的是,服务器将每个web的socket与二维码做个映射,某个二维码被扫了之后去查找对应socket然后发一条消息通知web端跳转.

这题就是自由发挥了,面试官主要看你思路.我觉得也可以让web不断去请求服务器,可能每秒一次.因为从需求上分析,同一时刻有大量用户扫码的情况是非常少见的,所以即使请求多次也不会太大负担.

然后这里你可以延伸一下,比如多久请求一次比较好?一般二维码出现后,到我们拿起手机扫码这几秒内,可以少请求几次.再比如服务器怎么快速判断你扫没扫码?我想到的是布隆过滤器.这里纯粹个人瞎想,反正这题应该是考察你的项目逻辑,自由发挥就好

  1. cookie和session区别(服务器,客户端),如果窃取了你得cookie能伪造你的身份吗?

答得不是很好,最后根据上网经历觉得应该不能.其实应该是能,但是现在大家都防范了所以我们感觉不出来.然后下一问就是怎么防范,我就说走jwt那套流程

  1. 问个java,GC机制(先讲了jvm五个分区,然后说gc一般发生在新生代,标记-整理/清除/复制讲完就过了)

  2. 算法题,买股票,给你一个int数组代表每日股票价格,一日买一日出,我写完dp就行了,其实这就是求最大差值,都不用花O(n)空间来做dp,但是我怕他出个变式就讲的dp.比如下面这题

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/

一面完面试官直接跟我说过了,然后hr打电话立马约二面.

二面

1.自我介绍

2.同一面,讲项目,跟你聊项目某些技术点,开发某个功能的流程.

3.数据库,在Innodb中,告诉你表结构,主键,索引.给你几条sql,让你回答那几条快,主要考察最左前缀,覆盖索引,辅助索引.大概这样

table t (id,a,b,c)
pk(id)
index(a,b)

下面哪些sql快

select a,b from t where b=xxx and a=xxx
select a,c from t where a=xxx and b=xxx
select a,b from t where b=xxx

第三条不符合最左前缀,索引失效,所以慢.
第二条查询了字段c,还需要回表一次,所以也慢.
第一条mysql会帮你将a b互换位置,这样满足最左前缀,且查询的字段覆盖索引,不需要回表,所以快.

select a,b from t where b=xxx and a=xxx order by a
select a,b from t where b=xxx and a=xxx order by c
第二条由于需要c排序,所以还是要回表,故第一条快.
  1. 网络,http跟https区别(一个明文一个加密),https加密流程.剩下还是tcp跟udp区别,一般用udp干啥.tcp谁time wait,等待多久,作用什么

图片说明
图片来自网络,侵删

udp可以打游戏,因为玩某些东西需要udp代理.

图片说明

客户端time_wait 2msl.还问了我msl什么意思,忘了.maximum segment lifetime 最大分节生命期.
功能这点我看网上有人对这个有争议,我觉得两点:防止阻塞报文在连接关闭后抵达和保证客户端发送的最后一个ack报文段能够到达服务器

  1. HashMap底层数据结构(数组+链表),插入元素是头插还是尾插,扩容机制,以及ConcurrentHashMap怎么实现并发控制的

1.8之前头插 1.8是尾插

默认扩容因子0.75,链表过长时转换为红黑树,扩容之后还需重新计算旧元素的Hash并重新分布.
ConcurrentHashMap内部使用synchronized关键字上锁.1.8降低了锁的粒度,抛弃了对segment上锁的做法,只对HashEntry上锁.

  1. 算法题1:盗贼入室偷东西问题,不能偷相邻房子(很经典的dp).
    进阶:如果房子首尾相连怎么办

我说可能是尝试把dp[0]初始化改成最后一个房子的钱?还不确定,需要用纸笔推导一下.如果不行我还有另外一个思路就是反过来,假设村子里没有房子,我们去建房子这样的思路,然后放我过了.前两天刷题碰到个有点点类似的:https://leetcode-cn.com/problems/burst-balloons/

  1. 给你一个数组,再给你一个数m,从数组中删除m个数,剩下的数组组成的十进制数最多是多少?
    例如:数组;[3,4,2,1,6] m:1,删除3后得到4216最大.我的思路找波谷,没写完他说可以了.

先将数组首尾插入一个Integer.MAX_VALUE.(为了做图方便,下面的图我就用9表示MAX_VALUE)

图片说明

第一个波谷是3,删除3之后得到42169为最大值.
第二个波谷是1,删除1之后得到4269为最大值.
算法这么做背后的原理我之后试着证明一下,或者大佬评论区留言个更好的办法.

插入两个Integer.MAX_VALUE是为了防止找不到波谷.例如递增和递减情况

图片说明

图片说明

可以验证此时结果也是正确的.

#面经##校招##字节跳动##Java工程师#
全部评论
请问楼主三面通知了吗。
点赞 回复 分享
发布于 2020-07-26 11:20
删数字那个题可以单调栈来做。 栈里面维护的是从小到大。 从最高位开始枚举,如果当前数字大于栈顶元素,说明前面的数字较小,删掉后会更大,就打个标记全都删掉。 如果删的时候大于m了,就停止删除就好了,因为栈内是从小到大的,删的都是最小的数字。 如果循环跑完了删的数还不够m个,那么栈内是从小到大的,直接从栈里取,打标记删够m个就OK。
点赞 回复 分享
发布于 2020-07-26 13:15

相关推荐

10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
14 70 评论
分享
牛客网
牛客企业服务