Booking OA 兩道題,一道考經典二維 DP,一道考字串處理 + 排序綜合能力。思路清晰但細節多,節奏要穩。以下是完整複盤。

考試概況
| 項目 | 詳情 |
|---|---|
| 平台 | HackerRank |
| 題數 | 2 道 |
| 難度 | Medium / Medium |
| 崗位 | SDE |
| 核心考點 | 動態規劃、HashMap、HashSet、自訂排序 |
Q1:最大正方形(Maximal Square)

題目核心
給定一個由 '0' 和 '1' 組成的二維矩陣,找出其中只包含 1 的最大正方形,返回其面積。
解題思路
暴力思路(O(mn·min(m,n)²),會超時)
枚舉每個格子作為正方形左上角,嘗試擴展邊長,統計是否全為 1。當矩陣較大時明顯超時。
最優解:二維動態規劃 O(mn)
定義:dp[i][j] 表示以 (i, j) 為右下角的最大全 1 正方形的邊長。
轉移方程:
- 若
matrix[i][j] == '0':dp[i][j] = 0 - 若
matrix[i][j] == '1':
$$dp[i][j] = \min(dp[i-1][j],\ dp[i][j-1],\ dp[i-1][j-1]) + 1$$
直覺:當前格子能構成的最大正方形,受限於左、上、左上三個鄰居中最小的那個——只要三個方向都能撐起邊長 k 的正方形,當前格子就能形成邊長 k+1 的正方形。
最終答案:遍歷所有 dp[i][j],取最大值 side,返回 side * side。
程式碼框架
def maximalSquare(matrix):
if not matrix:
return 0
m, n = len(matrix), len(matrix[0])
dp = [[0] * n for _ in range(m)]
max_side = 0
for i in range(m):
for j in range(n):
if matrix[i][j] == '1':
if i == 0 or j == 0:
dp[i][j] = 1
else:
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
max_side = max(max_side, dp[i][j])
return max_side * max_side
複雜度分析
- 時間複雜度:O(mn),只需遍歷矩陣一次
- 空間複雜度:O(mn),可優化到 O(n) 用滾動陣列
關鍵洞察
dp[i][j]的轉移只依賴左、上、左上三個格子。取最小值的原因:正方形的邊長由最短的那條「木桶邊」決定。這是矩陣 DP 中最經典的狀態定義之一。
Q2:酒店評論關鍵詞評分排序(Hotel Review Keyword Scoring)

題目核心
給定兩組關鍵詞(正面詞集和負面詞集),以及若干條酒店評論(每條評論關聯一個 HotelID)。根據關鍵詞出現情況計算每家酒店的總分,返回得分最高的前 k 家酒店 ID(分數相同時按 ID 升序)。
解題思路
整體流程:
- 將正面關鍵詞和負面關鍵詞分別存入兩個
HashSet,實現 O(1) 查詢 - 遍歷所有評論,對每條評論:
- 用正規表示式去除標點,統一轉小寫
- 拆分成單詞列表
- 遍歷單詞:命中正面詞 +1,命中負面詞 -1
- 將分數累加到
HashMap<HotelID, TotalScore>
- 將 Map 轉為 List,用自訂比較器排序:分數降序,分數相同則 ID 升序
- 提取排序後的前 k 個 HotelID
程式碼框架
import re
from collections import defaultdict
def topKHotels(positive_words, negative_words, reviews, k):
pos_set = set(positive_words)
neg_set = set(negative_words)
score_map = defaultdict(int) # HotelID -> TotalScore
for hotel_id, review_text in reviews:
# 去除標點,統一小寫,拆分單詞
words = re.sub(r'[^\w\s]', '', review_text.lower()).split()
for word in words:
if word in pos_set:
score_map[hotel_id] += 1
elif word in neg_set:
score_map[hotel_id] -= 1
# 自訂排序:分數降序,ID 升序
sorted_hotels = sorted(score_map.keys(),
key=lambda h: (-score_map[h], h))
return sorted_hotels[:k]
複雜度分析
- 時間複雜度:O(W log W),W 為所有評論的總單詞數(排序主導)
- 空間複雜度:O(H + K),H 為酒店數,K 為關鍵詞總數
關鍵洞察
用 HashSet 存關鍵詞,查詢 O(1);用 HashMap 累計分數,避免重複遍歷。排序時用自訂比較器同時處理「分數降序」和「ID 升序」兩個維度,是多鍵排序的標準寫法。
兩題核心思路對比
| 題目 | 核心技巧 | 時間複雜度 | 空間複雜度 |
|---|---|---|---|
| Q1 最大正方形 | 二維 DP,min 三鄰居 +1 | O(mn) | O(mn) |
| Q2 酒店評分 | HashSet + HashMap + 自訂排序 | O(W log W) | O(H + K) |
常見思維誤區
| 題目 | 誤區 | 正確方向 |
|---|---|---|
| Q1 | 枚舉所有可能正方形,O(mn²) 超時 | 用 DP 遞推,O(mn) 一次遍歷 |
| Q1 | 轉移方程用求和而不是取最小 | 取 min,正方形由最短邊決定 |
| Q2 | 用 List 線性查找關鍵詞 | 用 HashSet,查詢 O(1) |
| Q2 | 分數相同時忽略 ID 排序規則 | 自訂比較器同時處理兩個排序維度 |
Booking OA 應試策略
臨場節奏
- 先讀完兩題,判斷難度分配時間
- Q1 類矩陣 DP:先想「以當前格為右下角」的狀態定義,轉移方程幾乎都是三鄰居取 min/max
- Q2 類字串統計:先確定資料結構(HashSet 查詢 + HashMap 累計),再處理排序
- 寫完跑樣例,注意邊界(空矩陣、k 大於酒店數)
相關 LeetCode 練習
| 題號 | 題目 | 對應考點 |
|---|---|---|
| 221 | Maximal Square | Q1 完全相同 |
| 1277 | Count Square Submatrices with All Ones | Q1 變體 |
| 85 | Maximal Rectangle | Q1 進階 |
| 692 | Top K Frequent Words | Q2 排序方式 |
| 1 | Two Sum | Q2 HashMap 基礎 |
🚀 需要 Booking OA 輔助?
oavoservice 長期穩定承接 Google、Amazon、TikTok、Booking、Uber、Bloomberg、微軟 等各大科技公司 OA / VO 輔助,國內外面試筆試均可,高頻題庫覆蓋率極高。
立即添加微信:Coding0201
獲取:
- ✅ Booking OA 實時輔助(螢幕共享 + 實時打字提示)
- ✅ HackerRank 真實題庫(覆蓋 80%+ 高頻題)
- ✅ 一對一模擬 OA + 詳細反饋
- ✅ VO 面試輔助(演算法 + 系統設計)
📱 微信:Coding0201 | 💬 Telegram:@OAVOProxy | 📧 [email protected]
聯繫方式
Email: [email protected]
Telegram: @OAVOProxy