工作2年渣本面试被虐惨,回家修炼2个月,终于挤进“字节跳动”

还记得,今年年初因为疫情一直被困在家里出不去,后面5月份去了一趟字节跳动面试,结果却被虐惨。哎,只恨当初不好好学习,读书的时候要么出去嗨皮,要么就打王者,三天打鱼两天晒网,怎么也学不进去。后面毕业了,找了份测开。工作快两年了,现在才下定决心好好学Java,5月去面试之前,其实我差不多也是个懵逼的状态吧,总以为自己还挺不错的,结果却被现实赤裸裸的打脸了,实力被吊锤(三范式都答不出来你敢信?),真的简直一渣渣。

 

灰溜溜的回家,一下就感觉对什么都失去了信心,多亏了朋友们的鼓励。下定决心,痛改前非,用了3个月时间,好好学习。基本所有常见知识点都扫了一遍,然后用思维导图捋顺复习思路常见考点深入源码多思考为什么?每天早上8点起来学习到晚上11点多,然后睡觉。(当然,除去吃饭洗澡上厕所的时间)说实话,这三个月下来,感觉自己都脱胎换骨了。讲真,专心学东西,学完真的很爽。虽然现在还是有很多不足,毕竟突击学习的东西不够稳固,但是也是告诉大家,突击也是有可能拿offer的,不要放弃,多投多面!

对了,去了两次字节,趁着现在还有点记忆,回忆一下我完整的一次字节面经(Java后台开发岗,3面技术1面hr)

字节面经

一面

  • 自我介绍:讲了下自己的项目经历
  • 问了下技术栈
  • HashMap 和 ConcurrentHashMap 的区别?
  • 线程池
  • 线程安全怎么实现?
  • 数据库的锁
  • 数据库的三范式
  • 线程和进程的区别
  • Redis 的过期策略、缓存雪崩、惰性删除
  • MySQL索引、b+树,为什么不用哈希map来存储?
  • 最左前缀原则

算法题目:随机链表复制

给定一个链表,节点数据结构如下,除了包含一个next指针,还包含一个rand指针,随机指向链表的某一元素,或者为空指针,实现一个函数,深复制这个链表,要求空间复杂度O(1)。

struct Node {  int val;  Node* next;  Node* rand;}
  • 算法题目:滑动窗口算法

给定m个不重复的字符[a,b,c,d], 以及一个长度为n的字符串tbcacbdata, 问能否在这个字符串中找到应该长度为m的连续子串,使得这个子串刚好由上面m个字符组成,顺序无所谓,返回任意满足条件的一个子串的起始位置,未找到返回-1。比如上面的这个例子,acbd,返回3。要求优化到O(N)。

 

二面

  • 怼项目(质疑我的缓存一致性操作,然后我口嗨用消息队列解决并发问题)
  • 手写单例模式-懒汉模式
  • InnoDB和MyISAM的区别
  • 索引的底层实现结构是什么?为什么要这么实现?三层B+树节点的个数如何计算?
  • JAVA的锁、乐观锁悲观锁
  • 代码题:最大岛问题(我想了个分治,思路不对,直接爆炸,面试官还是不错的,给我换了道题)
  • 代码题:有序数组旋转后找最小值所在位置、给出一个有环的链表输出环的长度;
  • 代码题:给出一个链表,每两个节点旋转一次,最后返回旋转后的链表;
  • 智力题:64匹马,8个赛道,找出前四匹马最少需要比几次;
  • 三次握手,最后一次握手能不能取消?
  • TCP的四次挥手
  • HTTPS
  • 分代回收在整个GC中处于什么位置?

三面

  • 自我介绍、怼项目、Redis缓存

  • synchronized锁是什么锁(我就说了是系统的同步互斥锁)原理应该是monitor(监视器)

  • 垃圾回收(然后我说了四种引用什么时候GC)

  • 为什么hashmap不是线程安全的?

  • LRU在操作系统怎么实现?

  • HashMap扩容底层实现

  • Git 底层实现;如何解决冲突?

  • 设计题:关注系统怎么设计? 可以关注、取关别人 可以查看关注、粉丝列表 可以查看关注、粉丝数 快速判断两个人的关系

  • 如果有大V(粉丝数很多),你的系统有没有问题?或者说如果觉得没问题,为什么没问题?(存储上,使用上)

  • 编程题1:股票利润1

  • 编程题2:股票利润3(可以买卖两次)(查了下,就是股票利润3,hard)

(写了半天,头秃,之前都没做过,想了几个办法都感觉不行,不断地跟面试官交流,好在最后在面试官的引导下写出来了) 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
  • 编程题3:两个单向链表进行加和,例如1->2->3->4,另一个是3->4,返回一个链表1->2->6->8;不可以遍历转出数字直接加。。。

HR面

都是一些比较常规性的问题,这里就不说了。

继续唠嗑

开头的时候我说过在复习的时候,把基本比较常见的知识都扫一遍(我扫的是一份30个章节分类的Java知识大全整理),然后用思维导图捋顺复习思路(我这儿有JVM、Spring、SpringBoot、性能调优、多线程、高并发、Redis、MySQL、kafka、RabbitMQ等),常见的考点深入源码(这边源码我主要是算法的源码、Spring的源码等),然后就是刷题目了。

简单说说...(其实这些“Java知识大全整理、思维导图、源码、算法、还有刷题大全1000以及各大厂的面经”我这儿都有整理,如果有需要可以直接来找我免费分享,click here !

  • Java知识大全整理

这个PDF真的很全面,有JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算等

 

  • 思维导图(每个小分支点击都有相应的解析,上几个看看)

 

 

 

 

  • 刷题(互联网 Java 工程师面试1000题)

包括了Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等

 

 

  • 关于算法学习

应该有很多朋友想问我算法怎么准备?其实我个人偏向兔系刷法,第一遍思考5分钟做不出来的题目直接看答案,但是注意,最终每道题一定要自己完整的敲出答案来,不能边写边看。二刷的时候追求速度,一天10道题左右,题目范围就是 剑指offer 和 Leetcode100。另外一个,Leetcode上有一个字节跳动的题目区,里面的题目字节确确实实很常考,建议大家熟练掌握。

而且如果你选择看视频学习,这里也有技巧,很多人都有这种思维误区,看书的时候总爱一页一页看,一行一行读,看了前面忘了后面,看视频也是一点点看,效率其实不算高;建议讲废话的地方、你已经懂的地方,倍速播放, 拿好本子记录关键节点对应的时间戳,后续复习翻本子找对应的时间节点来看,效率怎么样,谁试谁知道。

  • 各大厂面经


不论是算法Leetcode、各大厂的面经、互联网 Java 工程师面试1000题、思维导图、Java知识大全整理还是更多的Java学习,上面截图可以看见小编这边都有整理,如果你不想麻烦再去找,可以直接 click here 免费下载!