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.系统设计题

如果让你设计一个通用的视频点赞系统,要求提供实时更新点赞的写入接口和实时读取点赞数的接口,你会怎么设计?

#字节面试题#
全部评论

相关推荐

已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务