面灵AI→

百度服务端实习一面:TCP/UDP、智能指针与红黑树,手撕翻转链表

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. TCP 和 UDP 有什么区别?
  2. C++ 智能指针有哪些?区别是什么?到底安不安全?
  3. C++ 的三大特性是什么?
  4. 多态的底层实现原理是什么?
  5. 介绍一下二叉树。
  6. 说一下红黑树。
  7. 算法题:翻转链表。

《参考解析》

TCP vs UDP:TCP 面向连接、可靠(序号确认、超时重传、去重排序)、有流量控制与拥塞控制、面向字节流、头部 20 字节起;UDP 无连接、不可靠、面向报文、头部 8 字节、没有拥塞控制所以延迟低,适合实时音视频、DNS、游戏。要能说出「TCP 的可靠靠什么」:校验和、序号、确认、重传、滑动窗口;以及「粘包怎么解决」:定长、分隔符、长度前缀。

智能指针:unique_ptr 独占所有权、不可拷贝可移动、零额外开销;shared_ptr 引用计数共享所有权,计数是原子的但对象本身不线程安全,make_shared 把控制块和对象一次分配;weak_ptr 不增计数,用来打破循环引用(父节点持有子节点 shared_ptr、子节点持父节点 weak_ptr)。「安不安全」要分三层:悬垂指针(get() 出来的裸指针生命周期不受管)、循环引用导致泄漏、以及 shared_ptr 的引用计数操作在跨线程拷贝时虽然原子但「读-改-写」组合不原子,多线程改同一 shared_ptr 仍需加锁。

三大特性与多态:封装、继承、多态。多态分编译期(重载、模板)与运行期(虚函数)。运行期多态靠虚函数表:每个含虚函数的类有一张 vtable,对象头部存 vptr,调用时通过 vptr 找到函数地址。构造/析构期间虚表指针的切换是常见坑——构造函数里调虚函数不会分派到子类。虚析构函数必须写,否则通过基类指针 delete 子类对象是未定义行为。

二叉树与红黑树:二叉树每个节点最多两个子节点,常见形态有 BST(左小右大,查找 O(h))、完全二叉树(可用数组存储,堆的基础)、平衡二叉树(AVL 严格平衡,查找快但调整多)。红黑树是弱平衡的 BST,五条性质保证最长路径不超过最短路径两倍,插入删除的旋转次数是常数级,因此增删性能优于 AVL,被 std::map、Java TreeMap、Linux 内核广泛使用。被追问就答「为什么不都用红黑树」:读多写少用 AVL,写多用红黑树,内存受限用跳表或哈希。

翻转链表:三指针迭代,prev=null, cur=head,循环里先存 next、再 cur.next=prev、再整体前移,返回 prev。O(n) 时间 O(1) 空间。写完主动说递归版(空间 O(n))与边界(空链表、单节点),并跑一遍 1→2→3 的推演,比空口说复杂度更有说服力。