大家好,我是菜饼。偷懒了很久,终于写下这篇秋招面经,整体分两部分,本文只记录具体面试题,另一篇文章则分享更细致的经历。
下篇见:https://www.nowcoder.com/discuss/580338
楼主情况
- 双非一本,JAVA选手(实习用的Go)
- offer 情况:腾讯SP、字节转正SP、快手直通终面(挂了)
秋招经历
- 5月初到字节实习,干到 8月份发现还没能转正,感觉不对劲,就准备了一阵子,开始投腾讯
- 实习期间打了快手的辣鸡比赛,拿了个直通终面卡(事实上并没有直通终面)大家以后看到说奖励有说直通终面的还是小心点吧。
- 后来拿到腾讯意向书后,就安心继续实习,等转正
- 字节转正率确实挺高的,周围人都转正成功了(不过据我了解,还是有一些人转正失败的)
腾讯后台(C++岗)
(08-25)一面-电话面
体验还是很不错的,面试官并不只是纯粹的问问题,会跟你交流,适当解答疑惑。
- 常规自我介绍,然后项目中引出的问题:
protobuf
具有压缩能力么?怎么理解?(面试官觉得使字节紧凑更加合适)缓存穿透(空缓存,追问有无其他方法,提示数据结构-bloom,然后讲布隆过滤器,存在不一定存在,不存在则一定不存在)
分布式缓存一致性算法(Paxos、Raft算法)
ConcurrentHashMap
如何保证线程安全提到
volatile
,讲一下(线程可见,防止指令重排)JAVA
做多线程开发,用过哪些常用的锁读多写少和写多读少的场景分别适合用啥锁?(前者乐观锁,后者悲观锁)
MySQL支持事务的引擎(InnoDB)
分布式事务实现方式
两阶段提交
redis
能做落地存储吗?(愣了半天,才搞清楚是想问持久化。RDB、AOF)RDB、AOF的优劣,然后场景举例让你选;
Redis内存满了怎么解决(扩容、调整过期删除策略、淘汰策略)
代码:发了QQ doc,在上面写,提前问了,不能用IDE调
- 字符串排序:
输入:字符串由数字、小写字母、大写字母组成。 输出:排序好的字符串。 排序的标准: 1. 数字 > 小写字母 > 大写字母; 2. 同类字符间的相对顺序不变; 要求: 3. 额外存储空间:O(1). // Example input: "acbd4231BADC" output: "4231acbdBADC" // function proto, you can redefine it if you use another language std::string stringSort(std::string& str);
- 在二叉排序树上找出第5大的节点。
输入:二叉排序树的根节点,该树确保左节点 <= 父节点 <= 右节点; 输出:第5大的节点 要求: 1. 不能把二叉树全量存储到另外的存储空间,比如存储到数组中,然后取出数组的第5个元素。 // node and function proto, you can redefine it if you use another language struct TreeNode { int value; struct TreeNode *left, *right; }; struct TreeNode* find5th(struct TreeNode* root);
(08-30)二面-电话面(1个小时)
- 常规自我介绍,项目中引出的问题:(项目讲了半小时)
- 缓存穿透的问题,如何解决?
- protobuf 如何压缩存储空间?
- 分布式事务(两阶段提交、本地消息表)
- 强一致性方案(去除缓存层)
c++
了解到什么程度?(学校讲的都会,深入的不会)volatile
的作用(线程可见性、保证指令不重排),具体哪些指令不会重排(不记得了)
智力题:
- 100张扑克牌,两个人轮流取,每次只能取
1
或者2
张牌,最后拿牌的赢,问先手还是后手有制胜策略?
先从最少的情况进行分析,剩1张,先手拿了就赢;剩2张,先手拿了就赢;剩3张,先手怎么拿都输;推广后就是想办法留下3的倍数张,100张先拿1张,就能必胜。对面拿1张,你就拿2张;对面拿2张,你就拿1张。
- (推广)
n
张牌,每次可以拿1-k
张,问满足什么条件下先手赢,满足什么条件下后手赢?
n不等于(1+k)的倍数时,先手赢;n等于(1+k)的倍数时,后手赢。然后问先手应该拿多少张牌,用数学表达式(n%(1+k)
)
- 现在有一个随机发生器(可以视为一个函数),产生
0
的概率是p
,产生1
的概率是1-p
,p
是确定的,但是不知道p
是多少,问能否利用这个随机发生器,设计一个可以等概率生成0/1
的发生器。
暴力法:用两个p
随机发生器,根据结果01
则返回0
,结果为10
则返回1
,结果为00、11
则丢弃重来;然后面试官问我,这种方法最终会需要重试,问我重试次数的期望是多少?(1/p(1-p)
)然后问p
越大,整个期望是越大还是越小?(p/(1-p)
)
- 然后就是反问阶段,问了下部门情况。
9-14(三面-腾讯会议面[我开视频,面试官不开])(半小时)
总监面日常等半个月...
自我介绍
让我挑一个项目讲,实习的或者自己做的。
围绕着我说的问了一丢丢技术问题,难度不大
项目的架构实现,实习期间主要承担哪部分工作
然后对着简历问项目(自己做的
demo
项目也被问了)消息系统的存储设计
继续问项目,然后反问阶段
总结:全程基本在聊项目吧,大多数时间都是我在说,基本没啥技术问题。
9-17(HR面-腾讯会议)(半小时)
整体来说
HR
面没啥难度,放宽心态,正常交流即可。
问腾讯字节怎么选
自我介绍
根据自我介绍问我的规划
快手(说好的直通终面呢?)
面试的时候确实就是抱着练手的心态,准备不是很充分。虽然说拿了
offer
大概率也不去,但是直通终面的承诺没兑现还是令人不爽的。牛客上看了其他拿了终面卡的小伙伴的面经也是类似,没看到一个是直接终面的。
(08-30)一面-视频面(1个小时)
常规自我介绍-项目介绍(具体省略了)
设计题,直播间,100w用户,发红包,3min后开始抢,(QPS可能达到1000w,具体怎么设计呢?)
增加条件:每个红包每个用户只能抢一次,每天不能超过5个;
详细讲一下HashMap的put过程
代码题:100w个单词,1<= 单词长度 <= 100,本质就是写一个Trie树。
class WordCollection { void load(List<String> words); // 加载 1000w 个单词 boolean contains(String word); // 判断是否包含该单词 }
(9-09)二面-视频面(40分钟左右)
常规自我介绍-项目介绍(具体省略了),相关问题:
除了
protobuf
还了解哪些RPC
序列化协议(thrift、其他就不知道了)缓存穿透(解释一下啥意思,然后常用解决方法:缓存null、布隆过滤器)
消息队列,
topic
的数量由什么来决定?(不会,这题到现在都没搞懂想问啥,有知道的朋友能说下么?)Redis
常用的数据结构(String、Map、Set、ZSet)、Set
和ZSet
的区别用
Redis
来实现网站PV
的统计,用String
作为计数器,会有线程安全的问题吗?(Redis是单线程的,应该没有线程安全的问题)设计题,注册接口(HTTP),设计限流方案,10000次/分钟。(令牌桶算法)
代码题:给一个有序数组和一个目标值,找第一个出现的目标值的下标,不存在则返回-1
。(先写了个递归的,写完面试官说能不能改成迭代的,就稍微改改变成迭代的了,但是一个if
判断写反了,卡了半天)
其实就是个二分法变种:
public int search(int[]arr, int value) { int l = 0; int r = arr.length; while(l < r) { int m = l + ((r - l) >> 1); if(value > arr[m]) { l = m + 1; } else { r = m; } } return arr[l] < value ? -1 : l; }
字节转正
字节转正需要答辩,预先要写好PPT
,挑选实习期间2-3
个主要产出进行叙述。除了自己做的内容,最好还要把上下游链路,用到的一些工具的底层原理了解一下。建议大家平时实习的时候就做好总结,不要停留在干活的表面,该深入了解的深入了解,该梳理的梳理。在字节实习还是能学到很多东西的。
转正时是要向menter
、leader
、HR
、组内同事、其他组的同事汇报工作的,每个人也会向你问一些问题,所以最好自己能提前根据PPT
内容,模拟一些问题,同时准备下解答,否则很容易被问懵的。
总结
其实复习到了后期,面试题的参考价值就仅仅在于查漏补缺了,常考的问题基本已经都会了,太偏太难的普适性又不高,更多的还是建议根据自己的简历来,简历上连Redis
都没有,也跟风去复习一些 redis 底层原理、分布式等等的东西,完全就没有必要。
全部评论
(3) 回帖