字节一面,服务端开发实习生-移动OS岗位,飞书?
- 自我介绍
- JVM内存结构,垃圾回收算法
- java的垃圾处理器,你觉得G1与其它的有什么区别
- redis的主从集群,
- redis的数据同步机制
- redis 的主节点挂了会咋样,哨兵模式中怎么选取的?
- RDB和AOF
- TCP三次握手过程
- 为什么要三次握手?,两次会发生什么?
- mysql建联合索引
- 项目中的排行榜怎么做的?插入的时间复杂度是多少?
- 算法:全排列
- 手撕:简易限流器。。。写了20多分钟,还写是写成一坨
- 还有什么想问的吗
- 面试官:感谢你的时间
1h,面试官没开摄像头,手撕的时候引导了一下,挺好的,可惜了,到底是谁在找实习啊!!!!!!
public class SlidingWindowRateLimiter { private final long windowSizeMillis; private final int maxRequests; private final Map<String, Deque<Long>> clientRequests; public SlidingWindowRateLimiter(int M, int N) { // 将秒转换为毫秒 this.windowSizeMillis = M * 1000L; this.maxRequests = N; this.clientRequests = new HashMap<>(); } /** * 检查客户端请求是否允许通过 * @param clientId 客户端ID * @param currentTime 当前时间戳(毫秒) * @return 是否允许请求 */ public boolean allowRequest(String clientId, long currentTime) { // 获取或初始化客户端的请求队列 Deque<Long> queue = clientRequests.computeIfAbsent(clientId, k -> new ArrayDeque<>()); // 移除所有过期的请求(早于当前窗口的起始时间) while (!queue.isEmpty() && queue.peekFirst() < currentTime - windowSizeMillis) { queue.pollFirst(); } if (queue.size() < maxRequests) { // 记录当前请求时间 queue.addLast(currentTime); return true; } else { return false; } } }#牛客在线求职答疑中心#