补充
已经拿到 offer call 了,感谢牛客!感觉运气不错,问题都比较基础,大家加油!
学习经历
说实话我是起步比较早的,入学后就打算毕业工作,大二也去了tx实习,但是搞的测开,岗位不是很满意,实习了几个月就溜了。今年年初还很迷茫,想去tx,搞了一阵子cpp,寒假就是打王者,三天打鱼两天晒网,学不进去,后来下定决心走JAVA(如果当初不浪费时间去搞不熟悉的cpp,可能更早就能拿offer,当然结局总归是好的)。1月份面了一次头条,实力被吊锤(三范式都答不出来你敢信),2月份面了一次阿里,感觉自己深度不足,开始规划复习进度,3月2号-3月15日,进步最快的两周,基本所有常见知识点都扫了一遍,面向面经复习,用思维导图捋顺复习思路,常见考点深入源码,多思考为什么;每天早上8点起来学习到晚上11点多,然后睡觉。(除去吃饭洗澡上厕所的时间)每周下来都感觉脱胎换骨,说实话专心学东西,学完真的很爽。虽然现在还是有很多不足,毕竟突击学习的东西不够稳固,但是也是告诉大家,突击也是有可能拿offer的,不要放弃,多投多面!祝大家都能拿到理想的offer~
算法学习
有不少同学私我问算法怎么准备,我个人偏向兔系刷法,第一遍思考5分钟做不出来的题目直接看答案,但是注意,最终每道题一定要自己完整的敲出答案来,不能边写边看。二刷的时候追求速度,我在三月份的时候进入二刷阶段,一天10道题左右,题目范围就是 剑指offer 和 Leetcode100。另外一个,Leetcode上有一个字节跳动的题目区,里面的题目字节确确实实很常考,建议大家熟练掌握。
对于初学者或者想快速提高的同学,我推荐左神的算法课,去年12月份我就跟同学一起过了一遍左神的初级班,从0到1的感觉真的很棒。几百块钱的课,在以前我也会觉得很贵,但大二到现在,靠自己技术也赚了几万块,用钱方面思路跟以前差别蛮大的,能有效提升自我的,校招拿个更高档次的offer,这几百块钱真的很便宜;当然了,觉得自己自制力不行的,不喜欢看视频的,那建议不买。用下面的链接购买可以减免140块,算下来差不多就是一两天工资。
https://www.nowcoder.com/courses/cover/live/350?coupon=At6W3pw
然后看视频这里也有技巧,很多人都有这种思维误区,看书的时候总爱一页一页看,一行一行读,看了前面忘了后面,看视频也是一点点看,效率其实不算高;建议讲废话的地方、你已经懂的地方,倍速播放, 拿好本子记录关键节点对应的时间戳,后续复习翻本子找对应的时间节点来看,效率怎么样,谁试谁知道。
楼主情况
- 双非一本,大三菜鸡,JAVA后台
- 拿到
offer
后会再补充学习经历和面试技巧
面试情况
- 字节三面完,18号二三面完,23号晚收到 oc。
- 腾讯目前三面完了,状态HR面,感觉是备胎,接了头条offer,不等了。(后续:oc的时候拒掉offer)
- 阿里还在面试中,暂时不放出来了。(放弃流程了,懒得面了)
字节跳动
(1-13)后台开发(一面挂)
一面面试官很不错,一开始还几次听不到我这边的声音,不知道是牛客的问题还是面试官的电脑问题;不过这个面试官真的挺好的,没有特别严肃,整体感觉还可以。
自我介绍:讲了下自己的项目经历、实习经历
问了下技术栈
HashMap
和ConcurrentHashMap
的区别?(不会,当时太菜了)线程池(当时就说了怎么用,连底层结构都答不上来,太丢人了)
数据库的锁(不会)
数据库的三范式(不会,还瞎扯了一堆)
第一范式是属性不可分;
第二范式是在第一范式的基础上,要求实体的属性完全依赖于主关键字,没有部分依赖;
第三范式是在第二范式的基础上,所有属性都和主键有直接关系,没有传递依赖。
线程和进程的区别
缓存(简单说了下浏览器缓存的作用)
算法题目1:随机链表复制(秒了)
给定一个链表,节点数据结构如下,除了包含一个next指针,还包含一个rand指针,随机指向链表的某一元素,或者为空指针,实现一个函数,深复制这个链表,要求空间复杂度O(1)
。
struct Node { int val; Node* next; Node* rand; }
算法题目2:滑动窗口算法(卡了蛮久)
给定m个不重复的字符[a,b,c,d]
, 以及一个长度为n的字符串tbcacbdata
, 问能否在这个字符串中找到应该长度为m的连续子串,使得这个子串刚好由上面m
个字符组成,顺序无所谓,返回任意满足条件的一个子串的起始位置,未找到返回-1
。比如上面的这个例子,acbd
,返回3。要求优化到O(N)
。
这道题没接触过,有点懵,不过在面试官提醒下写出了一个简单的版本,对不在m个中的字符和重复的字符进行了优化。
大家可以看到当时的我是有多菜了,3月5号重新被捞,约了13号一面。
3-13 视频一面(一个小时左右)
常规自我介绍
期间问了项目的问题:缓存一致性问题、MySQL乐观锁;
问之前实习的一些问题,在实习的时候学到了什么。
Redis 的过期策略、缓存雪崩、惰性删除
MySQL索引、
b+
树,为什么不用哈希map来存储?最左前缀原则
(A,B,C)的联合索引,去查 B = 0 和 C = 0,还会使用索引吗?
编程题
- SQL,求第二大的薪水
Employee +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ +---------------------+ | SecondHighestSalary | +---------------------+ | 200 |
- 给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。
输入 : 1->2->3->3->4->4->5->null 输出 : 1->2->5->null public class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } }
3-18 视频二面(一个小时左右)
面试官比较严肃。
自我介绍
怼项目(质疑我的缓存一致性操作,然后我口嗨用消息队列解决并发问题)
手写单例模式-懒汉模式
JAVA的锁、乐观锁悲观锁(视频卡出翔,面试官基本听不到我说啥,然后说我们来先做题吧,我??)
编程题1:最大岛问题(我想了个分治,思路不对,直接爆炸,面试官还是不错的,给我换了道题)
编程题2:股票利润1(还要求写测试用例,要求跑通)
编程题3:股票利润2(可以买卖多次)(这两题都秒了,面试前一晚正好想刷一刷dp的题,就刷了这两题,所以说大家想到什么一定要去学!!!)
TCP的四次挥手
HTTPS
分代回收在整个GC中处于什么位置?
3-18 视频三面(一个小时左右)
二面完也没告诉我过了,还在整理面经,没关牛客,突然就收到面试邀请。
自我介绍、怼项目、Redis缓存
LRU在操作系统怎么实现?
HashMap扩容底层实现
Git 底层实现;如何解决冲突?
设计题:关注系统怎么设计?
- 可以关注、取关别人
- 可以查看关注、粉丝列表
- 可以查看关注、粉丝数
- 快速判断两个人的关系
如果有大V(粉丝数很多),你的系统有没有问题?或者说如果觉得没问题,为什么没问题?(存储上,使用上)
编程题1:股票利润1
编程题2:股票利润3(可以买卖两次)(查了下,就是股票利润3,hard)
(写了半天,头秃,之前都没做过,想了几个办法都感觉不行,不断地跟面试官交流,好在最后在面试官的引导下写出来了)
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
- 最近有看什么书?接下来什么打算?
腾讯
3-5 电话一面(30min左右)
感觉比较赶,就简单问了几个问题
先自我介绍一下。
讲一下
websocket
?和http
有什么区别?讲到了建立连接,说说
TCP
三次握手。第三次握手失败会怎样?
为什么需要三次?两次可以吗?
提到了
SYN洪泛攻击
,讲一下了解
HTTP/2.0
吗?了解
HTTPS
吗?讲一下
nginx
谈到了跨域,讲一下跨域
谈到了
CORS
,我们一般怎么解决?nginx
在项目中怎样部署负载均衡呢?32机器,
2亿
个整数中找不重复数字?快速排序的原理、时间复杂度、空间复杂度
3-18 电话二面(50min左右)
二面鸽了我快两周整场面试体验还可以,题不难,有些题目比较新颖。
- 一个进程中,多个线程会共享哪些资源?
A. 栈 B. 数据段 C. 寄存器 D.线程ID
- 多线程中以下哪些操作需要同步操作?(说白了就是哪些操作不具备原子性)
A. x=y B. x++ C.x=x+1 D. x=1
如何轻量级实现进程间通信?(答了信号量,讲了下实现)
中断了解吗?CPU在中断时会干嘛?
动态链接和静态链接的比较(给了几个选项,不太记得了,很简单的)
设计题:设计高效的数据结构来实现下面的两个方法
解释下这两个方法,ADD来加入一个事件,RUN来执行事件,有点像缓存这些事件,到点了把执行完的事件删除。
ADD(int x, func *y) // x 是等待秒数,y是函数指针,意思是这个函数x秒后会执行 RUN() // 操作系统每一秒会执行一次 操作系统提供API:获取time(从1970年至今的秒数)
一开始想到了有序链表,ADD
O(N)
、RUNO(1)
;然后让我优化,想到了最小堆,ADDO(logN)
,RUN因为需要调整堆,也是O(logN)
;再然后类比LRU,想到用这个函数的开始执行时间(当前时间+等待秒数)作为key
,然后value为链表中的节点位置,用HashMap来存储,用一个链表来存储事件指针,ADDO(1)
,在面试官提醒下发现删除可以再用一次搜索(搜索当前时间)O(1)
。
- 问输入
www.qq.com
然后按下回车,浏览器作为客户端会发生什么?
浏览器的DNS缓存 -> 操作系统的DNS缓存 -> host文件 -> 本地DNS解析服务器
TCP三次握手 -> http传输数据 -> html文件、css文件渲染
- 第二次输入
www.qq.com
,和第一次有什么不同?
DNS缓存、http/1.0下长链接复用、静态文件缓存、携带cookie
四次挥手(从状态到报文控制标志位去讲具体流程)
为什么要四次、2MSL的作用
用过什么抓包软件?(wireshark、fiddle)
脑筋急转弯:1到10层电梯,每层电梯门口有1颗钻石,从1楼坐电梯到10楼,只能拿一次,怎么拿才能拿到最大的钻石?(我放弃治疗,想不出来。)
项目上线了吗?讲项目上线后遇到过什么BUG
3-19 电话三面(30min左右)
各种被打断,体验很差,只能说还是我太菜了,感觉要凉。
问实习经历
TCP和UDP的区别?
UDP不可靠的话,为什么可以用来发送文件?
TCP怎么做流量控制?
发送窗口、接收窗口、拥塞窗口三者的关系
拥塞窗口的变化规律
HTTPS的S是什么意思?
HTTPS的作用是什么?
为什么要用fiddler?
fiddler能看到HTTPS中的内容吗?
什么是时间换空间?有例子吗?
你觉得跟身边的同学比起来你的优点是什么?
有没有解决过复杂的问题?
什么是乐观锁?
草草收尾,没有反问阶段,就面了半小时。
后话
第一次写面经,格式方面调得不好请多担待。
超越姐姐真的很棒,多拜有奇效。
全部评论
(34) 回帖