近期某大厂的技术面试题及答案整理
以下是近期某外卖大厂某部们的真实面试题,技术和算法部分,供参考。
1、线上问题排查
比较经典的,线上 cpu 飙高时,怎样定位到问题的代码级别。
可以参考这边:CPU飙高和内存飙高的一般处理步骤。关键步骤:
1、top 定位进程,-Hp 定位线程
2、得到问题线程 id 后,16 进制转换,到 stack 日志中匹配查找问题线程日志信息,判断具体线程信息
3、例如确认是 gc 线程,那么就继续进行内存分析,一般是内存泄露或分配不当导致频繁 gc。接下来就是定位内存泄露位置 或 调整内存空间。
2、redis 数据结构,hash 和 zset 特点,什么时候使用,zset 范围查找的时间复杂度
先说结论:"范围查找" 时间复杂度平均是 O[(LogN)+M] M 是返回的元素个数
相关解析
Redis Zrange 范围查找 (分页)- 底层分析 https://juejin.cn/post/6844903478175727623
Redis Zrange 是有序集合( SortedSet ) 提供的一个命令,可以返回有序集中指定区间内的成员,而有序集合比较有用的一个功能就是 "范围查找" 时间复杂度平均是 O[(LogN)+M] M 是返回的元素个数,有序集合底层是通过字典+跳跃表的方式来实现的。而范围查找,则是使用了 span 字段。
如果不加这个 span 字段那么就只能退化成从最低层节点开始的位置不断的向后遍历直到找到我们要的范围起始位置节点,那么最终的时间复杂度也就是 O(n),然而加上这个 span 字段之后,也可以跟查找分数的方式一样从最高层利用 span 这个字段(记录距离下一个节点的距离),去不断的累加 span 值判断是否小于等于我们的起始位置,如果不等于则判断是否当前就是我们的起始位置,如果也不是那么就降下来一层继续累加 span,跟查找分数的方式基本一样.
举个栗子:
查找 > zrange key 5,2
那么就从最高层开始计算,首先
level4 -- score:0-span:1 + score:10-span:4 == 5
level3 -- ....
level2 -- ....
这样的话直接计算出来 score:20 是第 5 个节点,那么就确认了,也就代表直接定位到了第 5 个节点指针位置,那么最后就会在最低层以这个 score:20 节点指针作为开始位置不断向后获取 2 个节点然后返回结束.
所以使用 zrange 这个命令去范围获取,平均的时间复杂度就是 O[(LogN)+M],最坏的情况 O(n)
3、mongodb 使用,进程,为什么使用 mongodb,是否可以用 Hbase 或 mysql
mongodb 集群,主要包括 mongos 和 mongod 进程。mongos 相当于路由层,负责转发控制,包括分片的块如何迁移,都在 mongos 中进行控制;mongod 则是类似 mysql 的 InnoDB 的数据引擎进程,负责数据存储和数据访问、修改等能力提供。
4、mysql 锁的理解
mysql 使用较多,对锁的理解,什么是乐观锁、悲观锁,什么时候/为什么使用间隙锁
5、死锁发生条件
两个事务同时,事务 1 锁 A,申请 B;事务 2 锁 B,申请 A;互相等待依赖状态。总结:相互依赖,顺序不同-正好相反;
6、算法题:求最早公共交点
求两个单向链表的最早公共交点;如果没有返回 null。
相关解析请参见文章:求两个单向链表的最早公共交点
版权声明: 本文为 InfoQ 作者【程序员架构进阶】的原创文章。
原文链接:【http://xie.infoq.cn/article/2b8b11179d652acec37d90b04】。文章转载请联系作者。
评论