一、公司是做什么業務的?
二、介紹一下自己會用的,熟悉的技術棧?
三、“在 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 次),提升合并效率。
總結
整個過程分為 “拆分(局部排序)” 和 “合并(全局排序)” 兩步,核心是利用磁盤存儲中間結果,通過內存作為緩沖區實現多輪歸并。這是數據庫、大數據處理等場景中處理超大規模數據的基礎思想,體現了 “內存有限時,用磁盤換空間,用分治換效率” 的設計思路。