24年1月字节三面面试回顾 (已挂)
1.自我介绍
(1)请你简单的自我介绍下。
(2)你X月从上家公司离职,请问你在这家公司的级别是什么?目前你待过的这几个公司,每一家的离职原因是什么?
(3)你确定你愿意放弃现在轻松的工作吗?原因是什么?
2.八股文
(1)我看你简历写了使用过redis, mongdb, es等,你觉得你对哪个中间件的实现原理最了解?
(2)redis常用的数据结构分别有哪些?其中zset底层是怎么实现的?SkipList是怎么实现的?
(3)es底层是怎么实现的?它的索引是怎么存储的?
3.算法题
问题描述:
(1)有一排100个方块,每个方块放着毒蘑菇会消耗能量或者体力蘑菇增加能量,用户初始能量为m,每跳过一个方块要消耗一个能量,可以一次跳多个方块,如果在某个方块时能量为0或者负数,用户就死亡了,问能否从第一个方块跳到最后一个方块,能的话,剩余的最大能量是多少?如果初始能力不能跳到终点方块,则返回-1。
(2)如果每经过一个方块,需要消耗经过方块数的平方,那么用户能否从从第一个方块跳到最后一个方块,能的话,剩余的最大能力是多少?
解析:用户需要从头跳到终点的方块,这个过程可以一次跳多个方块,每次跳到某个方块会吃到毒蘑菇或者能量包,比如初始能量10,从第1个方块跳到第5个方块,这样它的初始值就会增加或减少第五个方块放置的物品的能量,然后还要减少一次跳4个格子消耗的能量,这个过程中,用户经过停留的任何一个方块时,都要保证他的剩余能量大于0,不然用户就死亡了。
解决方案:
碰到最大/小,最多/少,基本上都是用动态规划来解决
代码:
public int maxEnergyLeft(int[] blocks, int m) { int n = blocks.length; int[] dp = new int[n+1]; Arrays.fill(dp, Integer.MIN_VALUE); dp[0] = m; for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { int curLeftEnergy = dp[j] - (j-i) * (j-i) + blocks[i]; if (curLeftEnergy > 0) { dp[i] = Math.max(dp[i], curLeftEnergy); } } } if (dp[n] == Integer.MIN_VALUE) { return -1; } return dp[n]; }
4.系统设计题
如果让你设计一个通用的视频点赞系统,要求提供实时更新点赞的写入接口和实时读取点赞数的接口,你会怎么设计?
#字节面试题#