一、公司是做什么业务的?
二、介绍一下自己会用的,熟悉的技术栈?
三、“在 Spring 应用中,当你发起一个 RESTful API 请求时(例如 GET /api/users/1
),计算机系统是如何知道这个请求的?请结合计算机网络(从客户端到服务器的传输过程)和 Spring 框架(服务器端的处理流程)详细说明这个过程。”
四、动态规划和贪心算法的异同点
五、假设利用贪心算法解决背包问题的话,怎么判断当前结果最优?
六、上学期学了什么课?
七、路由器是网络中用于路径选择的设备,那路由器之间通常会使用哪些协议来构建它的路由表?怎么构建这个路由的数据包?
八、TCP如何控制网络的包让传输的链路是可靠的?
九、学了哪些流量控制的算法?
十、理不理解SpringCloud用来干什么的?
十一、假设现在有1000条数据,对它进行排序但是有一个现实条件就是在内存里面最多只能放十条数据,在这个内存受限的情况下,那么你觉得如何去把这1000条数据进行排序?
一、公司是做什么业务的?
相当于一个网上商城
二、介绍一下自己会用的,熟悉的技术栈?(就这些就没了?)
spring,spring boot ,spring mvc, mysql, mybatis,redis,docker
三、“在 Spring 应用中,当你发起一个 RESTful API 请求时(例如 GET /api/users/1
),计算机系统是如何知道这个请求的?请结合计算机网络(从客户端到服务器的传输过程)和 Spring 框架(服务器端的处理流程)详细说明这个过程。”
回答思路(分阶段说明)
1. 客户端发起请求(计算机网络层面)
应用层:
- 客户端(浏览器、Postman 等)通过 HTTP 协议发送请求(如
GET /api/users/1
)。- 请求包含:URL、HTTP 方法、请求头(如
Content-Type
)、请求体(如 JSON 数据)。传输层:
- 客户端通过 TCP 协议建立与服务器的连接(默认端口 80/443)。
- TCP 协议将 HTTP 请求分割为多个数据包,并添加源 / 目标端口号。
网络层与数据链路层:
- IP 协议为数据包添加源 / 目标 IP 地址,通过路由器转发至服务器。
- 数据链路层将数据包转换为物理信号(如电信号、光信号)传输。
服务器接收请求:
- 服务器网卡接收物理信号,逐层解析(数据链路层 → 网络层 → 传输层),最终还原为 HTTP 请求。
2. 服务器接收请求(Spring 框架层面)
Tomcat 容器处理:
- 服务器上的 Web 容器(如 Tomcat)监听指定端口(如 8080),接收 HTTP 请求。
- Tomcat 将请求封装为
ServletRequest
对象,传递给 Spring MVC 框架。Spring MVC 前端控制器(DispatcherServlet):
DispatcherServlet
作为入口,接收所有请求。- 根据
HandlerMapping
找到处理该请求的 Controller 方法(如@GetMapping("/api/users/{id}")
)。拦截器(Interceptor)处理:
- 在请求到达 Controller 前,执行注册的拦截器(如
LoginInterceptor
)。- 拦截器可进行权限校验、日志记录等预处理,通过
preHandle
方法控制请求是否继续。Controller 处理请求:
- 匹配到的 Controller 方法被调用(如
UserController.getUserById(Long id)
)。- 方法参数通过
@PathVariable
、@RequestBody
等注解绑定请求数据。Service 与 DAO 层处理:
- Controller 调用 Service 层处理业务逻辑(如查询用户)。
- Service 调用 DAO 层(如
UserRepository
)访问数据库。数据持久化:
- DAO 通过 JPA、MyBatis 等 ORM 框架执行 SQL 查询,获取数据。
3. 响应返回客户端
Controller 返回数据:
- Controller 方法返回数据(如
User
对象),被@ResponseBody
注解转换为 JSON/XML。视图解析与消息转换:
HttpMessageConverter
将 Java 对象转换为 HTTP 响应体(如 JSON)。响应头与状态码:
- 设置响应头(如
Content-Type: application/json
)和状态码(如 200 OK)。通过网络返回客户端:
- 响应数据通过 Tomcat 封装为 HTTP 响应,经网络层、传输层返回客户端。
- 客户端解析响应,渲染数据(如浏览器显示 JSON 结果)。
总结(关键技术点)
- 计算机网络:HTTP 协议、TCP/IP 分层模型、数据包传输。
- Spring 框架:
DispatcherServlet
、HandlerMapping
、拦截器、@RestController
、HttpMessageConverter
。这个过程体现了 “请求 - 拦截 - 处理 - 响应” 的完整流程,也是 Spring MVC 框架的核心工作机制。
四、动态规划和贪心算法的异同点
- 相同点:均用于求解优化问题,通过分解子问题简化计算。
- 不同点:
- 动态规划:考虑子问题的所有可能解,存储中间结果(重叠子问题),通过全局最优解推导(最优子结构),适用于多阶段决策问题(如背包问题、最长公共子序列)。
- 贪心算法:每步选择局部最优解(不回溯),不存储中间结果,仅适用于局部最优能推出全局最优的场景(如哈夫曼编码、活动选择问题)。
五、假设利用贪心算法解决背包问题的话,怎么判断当前结果最优?
仅当背包问题满足 **“物品可分割(分数背包)” 且价值密度(价值 / 重量)单调递减 ** 时,贪心算法(优先选价值密度最高的物品)的结果才是最优的。若为 0-1 背包(物品不可分割),贪心算法无法保证最优,需用动态规划。
六、上学期学了什么课?
计算机网络、编译原理
七、路由器是网络中用于路径选择的设备,那路由器之间通常会使用哪些协议来构建它的路由表?怎么构建这个路由的数据包?
- 协议:
- 动态路由协议:内部网关协议(IGP,如 RIP、OSPF)、外部网关协议(EGP,如 BGP);
- 静态路由:手动配置,非协议。
- 路由数据包构建:协议通过交换 “路由更新报文”(含目标网络、距离 / 代价、下一跳等信息),路由器根据协议规则(如 OSPF 的链路状态、RIP 的跳数)计算最优路径,更新本地路由表。
八、TCP如何控制网络的包让传输的链路是可靠的?
- 机制包括:三次握手建立连接、四次挥手断开连接;
- 数据传输中通过序号与确认应答(ACK)、超时重传、流量控制(滑动窗口)、拥塞控制(慢启动、拥塞避免)、校验和(检错)、重排序与去重(处理乱序 / 重复包)实现可靠传输。
九、学了哪些流量控制的算法?
TCP 滑动窗口协议(基于接收方缓冲区大小动态调整发送窗口);
十、理不理解SpringCloud用来干什么的?
SpringCloud 是基于 SpringBoot 的微服务架构工具集,用于解决分布式系统问题,提供服务注册与发现(Eureka/Consul)、负载均衡(Ribbon)、熔断降级(Hystrix)、API 网关(Gateway)、配置中心(Config)等组件,简化微服务的开发与治理。
十一、假设现在有1000条数据,对它进行排序但是有一个现实条件就是在内存里面最多只能放十条数据,在这个内存受限的情况下,那么你觉得如何去把这1000条数据进行排序?
外部排序:分而治之
外部排序:的核心是 分而治之:先将大文件分割成内存可处理的小片段,分别排序后再合并成最终有序文件。
具体步骤
1. 拆分阶段(生成 “有序子文件”)
- 从原始数据中分批读取数据,每次读入 10 条(内存最大容量)。
- 对这 10 条数据用内存排序算法(如快速排序、归并排序)进行排序,生成一个 “有序子文件”(如
temp1.txt
),写入磁盘。 - 重复上述过程,直到 1000 条数据全部分批处理完毕。
- 1000 条数据 → 每次 10 条 → 共生成 100 个有序子文件(每个子文件含 10 条有序数据)。
2. 合并阶段(多路归并排序)
- 采用k 路归并(这里 k=10,即每次从 10 个子文件中取数据),利用内存作为 “缓冲区” 合并子文件:
- 从 100 个有序子文件中,各读取 1 条数据到内存缓冲区(共 10 条,不超过内存限制)。
- 从缓冲区的 10 条数据中,选出最小值,写入最终结果文件(
result.txt
)。 - 从该最小值所在的子文件中,再读取 1 条数据补充到缓冲区(保持缓冲区始终有 10 条数据)。
- 重复步骤 2-3,直到所有子文件的数据都被读取完毕。
- 若子文件数量超过 10 个(如 100 个),则分多轮合并:
- 第一轮:100 个子文件 → 10 轮合并(每轮合并 10 个)→ 生成 10 个 “二级有序子文件”。
- 第二轮:10 个二级子文件 → 1 轮合并 → 生成最终的有序文件。
关键技术点
- 缓冲区管理:内存始终只存 10 条数据(用于临时存储各子文件的当前待比较数据),避免内存溢出。
- 多路归并优化:通过败者树(Loser Tree) 或堆(Heap) 高效选出最小值,减少每次比较的次数(从 k-1 次降至 log₂k 次),提升合并效率。
总结
整个过程分为 “拆分(局部排序)” 和 “合并(全局排序)” 两步,核心是利用磁盘存储中间结果,通过内存作为缓冲区实现多轮归并。这是数据库、大数据处理等场景中处理超大规模数据的基础思想,体现了 “内存有限时,用磁盘换空间,用分治换效率” 的设计思路。