字节面试分享复盘

1. 从输入 URL 到页面展示,涉及哪些网络协议?

小白通俗完整版口述答案(分层说,面试官最爱听)

整个流程按照OSI七层模型、TCP/IP五层模型从上到下,一共用到这些协议,我按访问流程一步步说:

  1. 应用层(最上层,用户操作层)HTTP/HTTPS、DNS

    1. DNS协议:把我们输入的域名(比如www.baidu.com),翻译成服务器IP地址,电脑只能识别IP,看不懂域名

    2. HTTPS/HTTP:浏览器和网页服务器传输网页数据的协议,现在全部网站都是HTTPS,HTTP是明文不安全

  2. 传输层TCP

    1. HTTPS底层基于TCP,负责建立可靠连接,保证数据不丢包、不乱序传输
  3. 网络层IP、ICMP

    1. IP协议:负责寻址路由,把数据包从本机转发到目标服务器,找路用

    2. ICMP:辅助协议,ping命令就是用它,检测网络通不通

  4. 数据链路层ARP

    1. ARP协议:把IP地址转换成网卡MAC物理地址,局域网内部传输数据必须用MAC地址
  5. 物理层:无上层协议,就是网线、光纤、网卡传输二进制比特流

面试精简总结版(收尾):整体核心协议:DNS、HTTPS、TCP、IP、ARP。


2. 中间人攻击发生在哪一层?

核心结论:主要发生在应用层、网络层;最常见、面试标准答案:应用层和传输层之间,绝大多数考题答案:传输层/应用层

通俗拆解(新人必懂):

  1. 中间人攻击原理:黑客拦截我和服务器之间的网络数据,窃听、篡改数据;

  2. HTTP明文传输,传输层数据无加密,黑客直接拦截;所以未加密的HTTP中间人攻击主要在传输层

  3. HTTPS如果被伪造证书钓鱼劫持,攻击发生在应用层

面试直接背标准答案 :中间人攻击主要发生在传输层和应用层 ;常规八股标准答案:主要归属传输层(TCP层),证书劫持类中间人攻击在应用层。

补充小白知识点:HTTPS就是为了防御中间人攻击,加密传输+校验证书


3. TCP 和 UDP 分别什么场景用?

1. UDP 底层原理(简单无状态)

UDP全称用户数据报协议,底层无连接、无状态

  1. 底层没有握手流程,发送方直接把数据+目标端口,封装成UDP数据报,直接扔给网络层传输;

  2. 底层不保存通信双方状态,发送完直接不管,不会记录对方有没有收到;

  3. 底层仅做最简单的格式校验:校验数据是否传输破损;破损直接丢弃,不会通知重传;

  4. 底层没有数据包排序、流量控制、拥塞控制逻辑;数据包可能乱序、丢失、重复到达

底层特点:封装头部极小、开销极低、传输延迟最小,底层结构极简

2. TCP 底层原理(面向连接可靠传输)

TCP全称传输控制协议,底层面向连接、有状态、全流程校验,四大底层核心机制

  1. 底层握手机制(三次握手):传输数据之前,底层必须先建立专属双向通信通道;确认收发双方收发能力正常,才可以传输数据,建立稳定连接

  2. 确认应答+超时重传(可靠性底层核心):对方收到数据包必须返回ACK确认报文;发送方收不到确认,底层自动判定丢包,重新发送数据包,保证数据不丢失

  3. 数据包排序机制:TCP底层给每一个数据包标记序列号;接收方按照序列号重组数据,解决网络传输乱序问题

  4. 流量控制+拥塞控制:底层动态控制发送速度;防止发送方发太快压垮接收方设备;防止全网网络拥堵导致大面积丢包

TCP断开连接底层:四次挥手,双方主动断开通道,安全释放连接资源

先记两个核心区别:

  • TCP:可靠、有连接、慢、会重传、有序; 需要先握手建立通道,数据绝对不能丢、不能乱序

  • UDP:无连接、不可靠、快、无重传; 不用建立通道,直接发数据包,丢一点数据无所谓,追求速度

TCP 使用场景(数据不能丢)

  1. 网页访问(HTTPS底层TCP)、文件传输FTP、邮件收发

  2. 接口调用、数据库访问、登录注册业务

  3. 总结:所有业务数据、文件、文字类传输全部用TCP

UDP 使用场景(允许少量丢包,优先速度)

  1. 直播、短视频、语音通话、视频通话

  2. 游戏联机(王者荣耀、吃鸡实时帧同步)

  3. 广播、内网设备发现

  4. 总结:音视频、实时游戏、高并发广播场景全部用UDP


6. QUIC 协议是不是结合了TCP和UDP两者优点?

是,完全就是融合两者核心优点的升级版协议

  1. 底层载体:QUIC 基于UDP协议开发 ,继承UDP优点:传输速度快、无握手阻塞、弱网表现好

  2. 上层逻辑:自己实现了TCP的全部可靠机制,继承TCP优点:保证数据不丢包、数据有序、重传失败数据包

  3. 额外新增优势(面试加分):解决TCP硬伤------队头阻塞、网络切换重连慢;手机WiFi切流量不用重新握手

总结口述话术:QUIC底层跑UDP,拥有UDP高速、低延迟的特点;自己封装了TCP的可靠传输逻辑,保障数据可靠,完美结合两者优点,现在HTTP3协议底层就是QUIC。


7. 余弦相似度介绍

余弦相似度,是用来判断两个向量、两段文本、两组数据相似度高低的算法指标

核心公式

对于两个向量 A = (a₁, a₂, ..., aₙ) 和 B = (b₁, b₂, ..., bₙ),余弦相似度计算公式为:

cos(θ) = (A·B) / (||A|| × ||B||)

其中:

  • A·B = a₁b₁ + a₂b₂ + ... + aₙbₙ(向量点积)
  • ||A|| = √(a₁² + a₂² + ... + aₙ²)(向量A的模长)
  • ||B|| = √(b₁² + b₂² + ... + bₙ²)(向量B的模长)

底层通俗原理:

  1. 把文本、特征数据转换成数学向量;

  2. 计算两个向量之间的夹角余弦值;

  3. 夹角越小,余弦值越大,两个内容越相似

数值范围:-1 ~ 1

  • 等于1:两个内容完全一模一样

  • 等于0:两个内容毫无关系

  • 等于-1:两个内容完全相反

工程场景:大模型语义检索、文本查重、推荐系统、特征匹配


8. 红黑树解决什么问题,什么场景用?

先记住核心前提:普通二叉查找树有致命缺陷:数据有序插入的时候,会变成链表,查询速度从O(logn)退化到O(n),查询巨慢。

红黑树解决的核心问题

解决普通二叉查找树不平衡、退化成链表、增删查性能暴跌 的问题;通过染色+旋转,强制维持树的弱平衡,把增删查时间复杂度稳定控制在 O(logn)

适用场景需要频繁新增、删除、查询有序数据的场景;不适合大批量静态查询。

小白重点:不用懂左旋右旋、染色规则!新人面试只说解决树不平衡问题、稳定O(logn)复杂度即可。


9. 红黑树在工程中的实际应用场景?

全部都是工业级落地场景,直接口述背诵:

  1. Java底层:TreeMap、TreeSet 底层数据结构就是红黑树(最常考)

  2. Linux内核:进程调度、内存管理,用红黑树管理系统进程

  3. C++ STL:map、set 底层全部红黑树

  4. 数据库:部分数据库二级索引、内存临时有序索引


10. Top K 问题怎么解决?

Top K就是从一堆数据里,找出最大/最小的前K个数据

标准最优方案:堆排序

执行流程:

  1. 想要找最大前K个 :初始化一个容量为K的小顶堆

  2. 遍历全部数据,堆满K个元素之后;

  3. 后续遍历到比堆顶大的数据,替换堆顶,重新调整堆;

  4. 遍历结束,堆里面留存的就是最大前K个数据

时间复杂度:O(N logK),N是全部数据量


11. Top K 除了堆还能用什么?

按面试优先级排序,全部小白易懂:

  1. 快速排序(快排分区/快选):最优替代方案;利用快排左右分区特性,定位第K大元素,左边/右边就是TopK;复杂度O(N),小规模数据比堆更快

  2. 全局全量排序:最简单粗暴;把全部数据排序直接截取前K,缺点大数据效率极低,只适合小数据量

  3. 桶排序/计数排序:数据范围有限、整数数据专用;速度最快,局限性大

  4. 二叉搜索树:维护有序树,直接遍历取出前K个

面试总结话术:除了堆,小规模数据优先快选算法;数据范围固定用桶排序;极小数据直接全局排序。


12. K 的大小对方案选择的影响?

分4种情况,小白直接背结论:

  1. K很小(K<100):优先堆排序;内存占用极低,效率最高;

  2. K中等(100<K<1w):堆 和 快选都可以,优先快选;整体遍历耗时更低

  3. K很大(K接近N,比如前80%数据):放弃堆!直接全局排序最快;堆logK开销会变大

  4. K等于N:直接全部排序输出即可

核心逻辑:K越小,堆算法优势越大;K越接近总数据量,排序算法优势越大。


13. 10 亿数据量下怎么做 Top K?

核心难点 :10亿数据无法全部加载进内存,内存放不下,不能用普通堆、快排

工业标准方案:分治+小顶堆+外部排序(分步口述)

  1. 数据分片拆分:把10亿磁盘大文件,拆分成多个小文件,每个小文件数据可以全部读进内存;

  2. 分片局部TopK:每个小文件内部,用堆算出局部最大前K数据;

  3. 全局合并汇总:把所有分片的局部TopK结果,放入全局大顶堆,合并筛选出全局最终TopK;

面试加分补充:分布式场景下用MapReduce分治计算;大数据组件Hadoop原生支持海量TopK。

小白总结:海量数据核心思路------大拆小、内存算局部、堆合并全局。


15. AI 工程从 Prompt 工程到上下文工程到 Harness 到 Loop 的演化

  1. 第一阶段:Prompt 工程(最简单初级阶段)

    1. 核心:只修改输入话术;通过写清晰、规范的提示词,引导大模型输出想要的结果;

    2. 缺点:模型本身弱,光改话术上限极低,复杂任务跑不通

  2. 第二阶段:上下文工程(RAG本质就是上下文工程)

    1. 核心:不依赖Prompt话术,给模型外挂真实业务知识库;把外部业务文档拼接进模型上下文窗口;

    2. 让模型拿着外部真实数据回答,解决模型幻觉、知识滞后问题;

    3. 缺点:单次上下文固定,不能自主决策、不能执行动作

  3. 第三阶段:AI Harness 模型编排/管控工程

    1. 核心:给模型加外部调度框架;管控模型调用工具、接口、数据库;编排多模型流水线;

    2. 做任务分发、结果校验、流程管控;模型不再独立运行,外部系统调度模型工作

  4. 第四阶段:AI Loop 闭环自主循环(最高级Agent形态)

    1. 核心:闭环自动迭代;模型自主判断任务、自主调用工具、自主校验结果、自主复盘修正;

    2. 形成输入-执行-校验-修正的闭环循环;不需要人工干预,就是标准智能Agent

面试总结话术 :整个演化逻辑是从优化输入文本→补充外部知识→外部流程管控→自主闭环循环,从纯模型交互变成全自动智能Agent工程。


16. 为什么模型不够强但 Agent 效果还不错?

核心原因:Agent效果不依赖大模型本身底座能力,靠外部工程流程补齐模型短板,一共4点核心原因:

  1. 外部工具兜底:弱模型本身推理能力差,Agent可以调用计算器、接口、数据库、搜索引擎,靠外部工具完成复杂任务,不靠模型脑子算;

  2. 上下文外挂知识库:RAG外挂业务数据,弥补模型参数知识不足、幻觉问题;

  3. 流程拆解+闭环校验:Agent把复杂大任务拆成简单小任务,弱模型只需要完成简单子问题;循环校验修正错误;

  4. 人工规则+编排管控:Harness框架固定业务流程,大部分逻辑靠硬性规则执行,模型只负责做简单语义理解;

Agent是工程框架+工具+知识库+规则兜底,不是靠模型本身推理能力,小参数弱模型也能跑出很好的Agent效果。


18. 最长公共前缀

题目:给一组字符串数组,找出所有字符串开头最长的相同前缀

  1. 拿第一个字符串当做基准前缀;

  2. 依次和后面每一个字符串对比;

  3. 匹配不上就把前缀末尾删减;

  4. 前缀删减到空字符串直接返回无公共前缀;

  5. 遍历全部字符串,留存的前缀就是最长公共前缀

python 复制代码
def longestCommonPrefix(strs):
    # 情况1:数组里没有字符串,直接返回空
    if not strs:
        return ""
    
    # 拿第一个字符串当做基准前缀
    prefix = strs[0]
    
    # 遍历后面每一个字符串
    for s in strs[1:]:
        # 只要当前字符串不是以前缀开头,就不断截短前缀
        while not s.startswith(prefix):
            # 删掉前缀最后一个字符
            prefix = prefix[:-1]
            # 前缀删空了,说明没有公共前缀,直接返回
            if prefix == "":
                return ""
    # 全部比对完成,剩下的就是最长公共前缀
    return prefix


# 测试例子
if __name__ == "__main__":
    print(longestCommonPrefix(["flower", "flow", "flight"]))  # fl
    print(longestCommonPrefix(["dog", "racecar", "car"]))     # 空字符串
    print(longestCommonPrefix(["apple", "app", "application"])) # app
    print(longestCommonPrefix([])) # 空

最优思路:横向遍历比对;新人不用二分、纵向遍历,最简单横向遍历即可通过面试。


19. LRU 缓存实现

先通俗定义LRU :最近最少使用缓存;缓存容量满了之后,自动删掉最久没有被访问的数据,腾出空间存新数据。

标准底层实现结构哈希表 + 双向链表

  • 哈希表:负责快速查询数据,O(1)时间找到缓存元素;

  • 双向链表:负责排序;头部放最近访问数据,尾部放最少访问数据;增删节点不需要遍历,效率高;

完整工作流程

  1. 查询缓存:查到数据,把这个数据移动到链表头部;

  2. 新增缓存:缓存没满,直接插链表头部;缓存已满,删除链表尾部最少使用数据,新数据插头部;

  3. 修改缓存:更新数据,移动到链表头部;

相关推荐
凯瑟琳.奥古斯特2 小时前
力扣1008:前序重建BST
开发语言·c++·算法·leetcode·职场和发展
未秃头的程序猿3 小时前
虚拟线程用了一年,我真香了——10倍吞吐量是真实存在的
java·后端·面试
帅次3 小时前
Android 高级工程师面试:Flow 与状态流 近1年高频追问 22 题
android·面试·职场和发展
贺国亚3 小时前
Harness-架构原理与工程实践
面试
前端双越老师3 小时前
我多年积累的 100+ 简历优化经验,整理成了 Skill
面试·agent
weedsfly3 小时前
防抖与节流:从原理到 React Hook 封装
前端·javascript·面试
黄敬峰3 小时前
🚀 掘金独家:打造最值钱的 AI Agent——从核心概念到高性能代码实战
面试
tkevinjd4 小时前
力扣73矩阵置零
java·算法·面试·职场和发展
_abab4 小时前
Java面试宝典:从基础到架构2
java·面试·架构