← 返回博客列表
Booking

Booking OA 真題複盤:最大正方形 DP + 酒店評論關鍵詞評分排序

2026-03-31

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

Booking OA Q1


考試概況

項目 詳情
平台 HackerRank
題數 2 道
難度 Medium / Medium
崗位 SDE
核心考點 動態規劃、HashMap、HashSet、自訂排序

Q1:最大正方形(Maximal Square)

Booking OA Q1

題目核心

給定一個由 '0''1' 組成的二維矩陣,找出其中只包含 1最大正方形,返回其面積

解題思路

暴力思路(O(mn·min(m,n)²),會超時)

枚舉每個格子作為正方形左上角,嘗試擴展邊長,統計是否全為 1。當矩陣較大時明顯超時。

最優解:二維動態規劃 O(mn)

定義dp[i][j] 表示以 (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

複雜度分析

關鍵洞察

dp[i][j] 的轉移只依賴左、上、左上三個格子。取最小值的原因:正方形的邊長由最短的那條「木桶邊」決定。這是矩陣 DP 中最經典的狀態定義之一。


Q2:酒店評論關鍵詞評分排序(Hotel Review Keyword Scoring)

![Booking OA Q2](/images/booking/image copy.png)

題目核心

給定兩組關鍵詞(正面詞集和負面詞集),以及若干條酒店評論(每條評論關聯一個 HotelID)。根據關鍵詞出現情況計算每家酒店的總分,返回得分最高的前 k 家酒店 ID(分數相同時按 ID 升序)。

解題思路

整體流程

  1. 將正面關鍵詞和負面關鍵詞分別存入兩個 HashSet,實現 O(1) 查詢
  2. 遍歷所有評論,對每條評論:
    • 用正規表示式去除標點,統一轉小寫
    • 拆分成單詞列表
    • 遍歷單詞:命中正面詞 +1,命中負面詞 -1
    • 將分數累加到 HashMap<HotelID, TotalScore>
  3. 將 Map 轉為 List,用自訂比較器排序:分數降序,分數相同則 ID 升序
  4. 提取排序後的前 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]

複雜度分析

關鍵洞察

用 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 應試策略

臨場節奏

  1. 先讀完兩題,判斷難度分配時間
  2. Q1 類矩陣 DP:先想「以當前格為右下角」的狀態定義,轉移方程幾乎都是三鄰居取 min/max
  3. Q2 類字串統計:先確定資料結構(HashSet 查詢 + HashMap 累計),再處理排序
  4. 寫完跑樣例,注意邊界(空矩陣、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

獲取:

📱 微信:Coding0201 | 💬 Telegram:@OAVOProxy | 📧 [email protected]


聯繫方式

Email: [email protected]
Telegram: @OAVOProxy