一大波手撕正在靠近!

面试时候的手撕其实很少出得特别难,基本都是middle,考验你的基础,所以这里面是有一些高频考点的,我根据个人经历整理了一些比较通用的经典的手撕。

🛠️ 数据结构与算法(典中典

  1. LRU缓存 :HashMap 存值,双向链表 存序。思路: 读写都把节点拔出来插到链表头,容量满了删链表尾。
  2. K个一组翻转链表: 递归/迭代 + 局部翻转。思路: 够K个就断开翻转,不够直接还回;递归拼接下一组的结果。
  3. 合并K个升序链表: 最小堆 (PriorityQueue)。思路: 把所有链表的头结点扔进堆里,每次弹最小的连上,把它的next再扔进去。
  4. 无重复字符的最长子串: 滑动窗口 + 哈希/Set。思路: 右指针狂奔进窗,遇到重复的,左指针收缩直到重复元素滚粗。
  5. 接雨水 (Hard): 双指针 / 单调栈。思路: 左右双指针往中间缩,当前格水 = min(左max, 右max) - 只有地高。
  6. 二叉树的最近公共祖先 (LCA): 后序遍历 (左右根)。思路: 左右都找到了回Root,只找到左回左,只找到右回右,都空回Null。
  7. 岛屿数量: DFS + 沉岛思想。思路: 遇到 '1' 计数加一,然后开启DFS把上下左右所有的 '1' 全变成 '0' (炸沉)。
  8. 最长公共子序列 (LCS): 二维DP。思路: 相等则 dp[i-1][j-1] + 1,不等则取 max(左边, 上边) 继承最大值。
  9. 搜索旋转排序数组: 二分查找 + 判断有序区间。思路: 切一刀必定有一半是有序的,判断target在不在有序的那半里,不在就去另一半找。
  10. 下一个排列: 找小数,找大数,交换,翻转。思路: 从后往前找第一个降序的数A,再找刚比A大的数B,交换AB,把A后面全部翻转成升序。

🧵 多线程类

  1. 单例模式 (Singleton): DCL (双重检查锁) + volatile。思路: 两次判空,锁在中间;volatile 禁止指令重排,防对象半初始化。
  2. 生产者-消费者:wait/notify 或 Condition。思路:while(队列满) wait,while(队列空) wait,操作完记得 notifyAll。
  3. 三个线程交替打印 ABC: 信号量 (Semaphore) 或 state 变量。思路: A线程等A信号发B信号,B线程等B信号发C信号...形成闭环。
  4. 死锁演示: 嵌套锁。思路: 线程1拿锁A想拿B,线程2拿锁B想拿A,互相不撒手。

🧠 排序(年年考年年错

快速排序 (QuickSort): 分治 + Partition。思路: 选个基准(Pivot),小的甩左边,大的甩右边,递归搞定左右两边。

#一人分享一道面试手撕题#
全部评论
单例模式,如果是c++11以上的话可以直接返回静态局部变量,可以保证全局唯一的
1 回复 分享
发布于 01-07 21:47 四川
mark
1 回复 分享
发布于 01-06 10:51 广东
Mark
点赞 回复 分享
发布于 03-03 23:54 江苏
mark
点赞 回复 分享
发布于 02-05 21:15 新疆
Mark
点赞 回复 分享
发布于 02-03 22:18 陕西
Mark
点赞 回复 分享
发布于 02-03 16:38 浙江
Mark
点赞 回复 分享
发布于 02-02 16:41 湖南
Mark
点赞 回复 分享
发布于 01-31 17:40 上海
Mark
点赞 回复 分享
发布于 01-28 11:09 四川
Mark
点赞 回复 分享
发布于 01-27 16:33 陕西
Mark
点赞 回复 分享
发布于 01-25 22:05 四川
Mark
点赞 回复 分享
发布于 01-25 14:23 四川
Mark
点赞 回复 分享
发布于 01-22 00:16 广东
Mark
点赞 回复 分享
发布于 01-20 22:29 云南
mark
点赞 回复 分享
发布于 01-19 22:34 北京
mark
点赞 回复 分享
发布于 01-18 02:35 山东
Mark
点赞 回复 分享
发布于 01-12 10:06 江苏
Mark
点赞 回复 分享
发布于 01-12 09:25 广东
m
点赞 回复 分享
发布于 01-12 09:25 广东
mark
点赞 回复 分享
发布于 01-11 04:12 浙江

相关推荐

04-23 10:31
已编辑
山东大学 C++
拼多多一般多久出结果呢?一面感觉面的依托40分钟面完了。。感觉有点小寄整理一下一面的问题吧也学不进去。(1)门面模式,策略模式、模板方法 (因为项目写了!所以这么问的)门面:为复杂多子系统提供统一简洁接口,隐藏内部繁琐流程,降低调用复杂度,让外部只需一个入口就能使用整套功能。策略: 定义一系列可互换的算法策略,封装各自逻辑,运行时灵活切换算法,不修改原有业务代码,符合开闭原则。模板方法模式定义算法固定骨架流程,将步骤延迟到子类实现,不改变整体执行顺序,子类只重写具体细节,复用算法结构。(2)策略模式和工厂模式区别 (这个问题一直追问我!! 我只知道特别浅浅的东西)!!!工厂模式负责造对象,只关心怎么创建实例;策略模式负责用算法,运行时切换不同业务逻辑,工厂管创建,策略管行为。然后 追问 工厂模式不能做不同策略对象吗? 工厂造出策略对象,再交给策略模式去调度使用,二者分工完全不一样 然后又追问他们使用场景 多个同类对象,创建逻辑复杂多变,不想让业务代码直接 new 对象,统一封装创建,解耦对象生成与使用。 同一业务有多种算法 / 规则切换,比如支付方式、排序规则、优惠计算,运行时灵活替换业务逻辑。又追问 相同点是什么同时他们的区别是什么呢? 回答封装变化、都用到了多态,都降低了耦合、都符合开闭原则。不同点 一个创建对象一个选择对象怎么去干活的。第一个项目项目学到了说明一下 就随便说了一下简历上的东西 然后没有追问下面问rpc框架的东西了 因为简历有rpc。  自研 RPC 让我掌握TCP 粘包解决、动态代理、服务注册发现、负载均衡、SPI 扩展(3) 问怎么处理粘包!! 定消息头 + 长度域的私有协议,先读头获取长度,再按长度读体。(4) 为什么会有粘包的问题: TCP 是面向字节流的协议,没有消息边界,发送方批量发、接收方一次性读,就会出现多条数据粘在一起。(5) 问我tcp为什么是流式的?? 我直接蒙蔽了。。。我咋知道!!!TCP 是流式的,因为它的设计目标是提供一条可靠、有序、连续的字节管道,而不是独立数据包的传输服务。(6) 问我项目设计的 协议消息的格式是什么样子的 让我写道屏幕上 因为确实背了这里写出来了(7)问我 message length代表什么意思 message length 就是消息体的字节长度,告诉接收端要读多少字节才是一条完整消息,是解决 TCP 粘包半包的核心字段。(8)因为我使用的是recordParser去进行消息的处理然后面试官问我 没有被截取的部分怎么处理呢? 看了recordParser源码所以答出来了 没读完、不完整的字节,我会自动暂存在 Vert.x RecordParser 内部缓冲区里,不丢弃、不处理,等下一次数据到来继续拼接,直到凑够一整帧才交付(9)jdk动态代理是什么 !!(10)jdk动态代理底层是什么 运行时动态生成接口代理类字节码 → 加载进 JVM → 全部方法统一走 invoke () 反射调用 这里好像我当时说的怎么实现动态代理了因为我不知道底层所以当没听见。。。(11)红黑树和跳表的应用区别 redis?红黑树 范围查询慢 HashMap  跳表 插入 / 删除只改指针 范围查询极快(12)为什么空间复杂度都是O(N)(13)除了上面还有什么区别吗? 我又重复了一遍上面的回答。。。因为确实不知道了。。实现难度不同红黑树:极难,要处理旋转、变色、平衡,代码复杂易错。跳表:简单,只用随机层数 + 指针调整,代码短、易维护、易扩展。插入 / 删除稳定性不同红黑树:插入删除可能触发连锁旋转 / 变色,最坏会有O (logN) 次调整,高并发下有抖动。跳表:插入删除只修改前后指针,局部调整,无连锁反应,高并发更稳定。范围查询效率不同红黑树:范围查询要中序遍历,跳转多、缓存不友好,速度慢。跳表:直接在底层连续链表遍历,缓存命中率高,范围查询天生更快。并发场景支持不同红黑树:修改时影响路径多,加锁粒度大,并发性能差。跳表:操作局部化,加锁粒度小,更容易实现无锁 / 细粒度并发。缓存友好度不同红黑树:节点分散,CPU 缓存不友好。跳表:底层是连续链表,缓存命中率更高。(14) 又问他们读取的区别是什么呢?读取时会怎么样红黑树读取(查找)从根节点开始,不断左右跳转,走一条从根到叶子的路径节点在内存中不连续,CPU 缓存命中率低每次比较都可能缓存未命中,读取速度受影响范围查询需要中序遍历,跳转更多,更慢2. 跳表读取(查找)从最高层索引往下跳,快速缩小范围,最后落到底层有序链表底层是连续链表,内存局部性好CPU 缓存更友好,连续读取更快范围查询直接遍历底层链表,几乎无跳转,极快(15) 最后除了两道算法题1、是leetcode 面试150题里面的一个2、实现一个线程安全类 然后又add和remove操作!!都写出来!!42分钟差不多就面完了
点赞 评论 收藏
分享
评论
97
558
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务