面试题目
一、经历拷打
- 实习经历拷打
- 项目经历拷打
二、基础知识
- MCP 和 Skills 的区别
- ping 命令在网络底层做了什么
- C 文件编译执行的过程
- 协程是什么?Java 里有类似的实现吗?它有什么优点和缺陷?
- K8s、Docker 相关问题
三、手撕代码
- 手撕
sqrt —— 要求使用牛顿迭代法实现
- 手撕 —— 一个人开枪 10 次,总共打了 80 环,问有多少种可能(每次 0~10 环)
参考解析
Q3. MCP 和 Skills 的区别
- MCP(Model Context Protocol)是一种标准化协议,用于 AI 模型与外部工具/数据源之间的通信,强调上下文传递与工具调用的规范化。
- Skills 通常指 AI Agent 的能力单元,是对某一具体功能的封装(如搜索、计算),更偏向业务逻辑层。
- 简言之:MCP 是通信协议层,Skills 是能力实现层。
Q4. ping 命令的网络底层原理
- ping 基于 ICMP 协议(Internet Control Message Protocol),发送 Echo Request,目标主机返回 Echo Reply。
- 底层流程:应用层构造 ICMP 报文 → 网络层封装 IP 头 → 数据链路层封装以太网帧 → 经路由转发到目标 → 目标回包,计算 RTT。
- 不涉及 TCP-UDP,属于网络层协议,可用于测试可达性和延迟。
Q5. C 文件编译执行过程
- 预处理:展开宏、头文件(
#include、#define),生成 .i 文件。
- 编译:将预处理后的代码转为汇编代码,生成
.s 文件。
- 汇编:将汇编代码转为机器码目标文件,生成
.o 文件。
- 链接:将多个
.o 文件及库文件合并,生成可执行文件。
- 执行时由 OS 加载器将程序载入内存,分配栈/堆,跳转到入口点执行。
Q6. 协程及 Java 实现
- 协程是用户态轻量级线程,切换由程序自身控制,无需内核介入,切换开销极小。
- 优点:高并发、低开销、避免回调地狱、代码同步风格。
- 缺点:不能利用多核(单线程协程)、若有阻塞系统调用会卡住整个线程、调试复杂。
- Java 实现:Project Loom 的虚拟线程(Java 21 正式发布),
Thread.ofVirtual() 创建,底层由 JVM 调度,类似协程语义。
Q8. 牛顿迭代法求 sqrt
double mySqrt(double n) {
double x = n;
while (Math.abs(x * x - n) > 1e-7) {
x = (x + n / x) / 2.0;
}
return x;
}
- 核心迭代公式:
x_{n+1} = (x_n + n/x_n) / 2,二阶收敛,速度极快。
- 注意初始值选取和精度终止条件。
Q9. 10 次射击共打 80 环的可能数
- 每次得分范围 0~10 环,共 10 次,总分 = 80,等价于总分 缺少 20 环(满分 100)。
- 设
d_i = 10 - x_i,则 d_i ∈ [0,10],求 d_1 + d_2 + ... + d_10 = 20 的非负整数解数。
- 用容斥原理 + 隔板法:先求无上界方案数
C(29,9),再减去至少一个 d_i ≥ 11 的方案数。
- 至少一个超限:令
d_i' = d_i - 11,方案数 C(10,1)×C(18,9);两个超限:20 - 22 < 0,无解。
- 答案 =
C(29,9) - 10×C(18,9) = 10015005 - 10×48620 = 9528805 种。