腾讯企业微信测开一面(二面已拒)
吐槽一下:企业微信是真忙啊,面试过程中,面试官还会被拉去开会,开局写完三道算法之后,硬是让我等了将近一个小时,体验非常不好....
---
#### **一、算法题**
1. **二维数组处理**
- 题目描述:对二维数组按第一列升序、第二列降序排序后,求第二列的最长递增子序列
- 思路:排序后转化为最长递增子序列(LIS)问题,用动态规划或贪心+二分解决
2. **滑动窗口问题**
- 题目描述:维护一个窗口,保证窗口内字符不重复,求最大窗口长度
- 思路:滑动窗口+哈希表记录字符位置
3. **二叉树第K大元素**
- 题目描述:按左-根-右顺序收集元素后取第K大值
- 思路:中序遍历得到有序列表后直接取第K大(暴力解法)
---
#### **二、项目相关**
1. **登录鉴权机制**
- 流程:手机号+验证码登录,未注册用户自动注册
- Token刷新:通过拦截器对非登录请求刷新Token有效期
- **追问**:
- Token生成算法?使用JWT(Header+Payload+Signature)
- Token唯一性保障?通过JWT签名和用户唯一标识
2. **数据库优化**
- 慢查询解决:检查索引失效、分库分表、SQL优化
- **索引原则**:
- 高区分度字段优先
- 联合索引遵循最左匹配原则
- 避免对长文本字段建索引
---
#### **三、缓存问题**
1. **缓存穿透**
- 场景:请求不存在的数据(如非法ID)
- 解决:缓存空值+布隆过滤器
2. **缓存击穿**
- 场景:热点Key失效后高并发请求压垮数据库
- 解决:互斥锁(如Redis的SETNX)
3. **缓存雪崩**
- 场景:大量Key同时过期
- 解决:随机过期时间+集群部署
---
#### **四、多线程与锁**
1. **线程安全集合**
- `ConcurrentHashMap` vs `Hashtable`:分段锁 vs 全表锁
2. **锁机制**
- 悲观锁:`synchronized`、`ReentrantLock`
- 乐观锁:CAS(如Atomic类)、版本号
- **区别**:悲观锁强一致但性能低,乐观锁高并发但需处理冲突
---
#### **五、消息队列**
1. **选择RabbitMQ的原因**
- 轻量级、适合单体项目,对比Kafka/RocketMQ更简单
2. **长连接实现**
- 基于AMQP协议,通过心跳机制维持TCP长连接
---
#### **六、设计模式与AOP**
1. **AOP应用场景**
- 公共字段自动填充(如创建时间、更新人)
- 实现:通过切面拦截DAO层操作
---
#### **七、反问环节**
1. 实习生工作内容:测试平台开发,参与1-2个项目
2. 面试轮次:4轮技术面(按正式员工标准)
3. 改进建议:技术深度需加强(如Redis底层原理、锁实现细节)
---
**参考答案亮点**
- **JWT结构**:Header(算法)、Payload(用户信息)、Signature(签名)
- **索引失效场景**:对字段使用函数、类型隐式转换、模糊查询左匹配
- **CAS问题**:ABA问题(通过版本号解决)、自旋开销
- **RabbitMQ协议**:基于AMQP,支持多种消息模式(Work Queue、Pub/Sub)
---
#### **一、算法题**
1. **二维数组处理**
- 题目描述:对二维数组按第一列升序、第二列降序排序后,求第二列的最长递增子序列
- 思路:排序后转化为最长递增子序列(LIS)问题,用动态规划或贪心+二分解决
2. **滑动窗口问题**
- 题目描述:维护一个窗口,保证窗口内字符不重复,求最大窗口长度
- 思路:滑动窗口+哈希表记录字符位置
3. **二叉树第K大元素**
- 题目描述:按左-根-右顺序收集元素后取第K大值
- 思路:中序遍历得到有序列表后直接取第K大(暴力解法)
---
#### **二、项目相关**
1. **登录鉴权机制**
- 流程:手机号+验证码登录,未注册用户自动注册
- Token刷新:通过拦截器对非登录请求刷新Token有效期
- **追问**:
- Token生成算法?使用JWT(Header+Payload+Signature)
- Token唯一性保障?通过JWT签名和用户唯一标识
2. **数据库优化**
- 慢查询解决:检查索引失效、分库分表、SQL优化
- **索引原则**:
- 高区分度字段优先
- 联合索引遵循最左匹配原则
- 避免对长文本字段建索引
---
#### **三、缓存问题**
1. **缓存穿透**
- 场景:请求不存在的数据(如非法ID)
- 解决:缓存空值+布隆过滤器
2. **缓存击穿**
- 场景:热点Key失效后高并发请求压垮数据库
- 解决:互斥锁(如Redis的SETNX)
3. **缓存雪崩**
- 场景:大量Key同时过期
- 解决:随机过期时间+集群部署
---
#### **四、多线程与锁**
1. **线程安全集合**
- `ConcurrentHashMap` vs `Hashtable`:分段锁 vs 全表锁
2. **锁机制**
- 悲观锁:`synchronized`、`ReentrantLock`
- 乐观锁:CAS(如Atomic类)、版本号
- **区别**:悲观锁强一致但性能低,乐观锁高并发但需处理冲突
---
#### **五、消息队列**
1. **选择RabbitMQ的原因**
- 轻量级、适合单体项目,对比Kafka/RocketMQ更简单
2. **长连接实现**
- 基于AMQP协议,通过心跳机制维持TCP长连接
---
#### **六、设计模式与AOP**
1. **AOP应用场景**
- 公共字段自动填充(如创建时间、更新人)
- 实现:通过切面拦截DAO层操作
---
#### **七、反问环节**
1. 实习生工作内容:测试平台开发,参与1-2个项目
2. 面试轮次:4轮技术面(按正式员工标准)
3. 改进建议:技术深度需加强(如Redis底层原理、锁实现细节)
---
**参考答案亮点**
- **JWT结构**:Header(算法)、Payload(用户信息)、Signature(签名)
- **索引失效场景**:对字段使用函数、类型隐式转换、模糊查询左匹配
- **CAS问题**:ABA问题(通过版本号解决)、自旋开销
- **RabbitMQ协议**:基于AMQP,支持多种消息模式(Work Queue、Pub/Sub)
全部评论
相关推荐

点赞 评论 收藏
分享

点赞 评论 收藏
分享
点赞 评论 收藏
分享