Data Aggregation
Implement a Reading Analytics Aggregator
Reading Analytics Aggregator
難度:Easy
題目說明
你正在為一家電子書公司開發閱讀分析系統。系統收集了用戶閱讀行為的原始數據,但需要將這些數據合併以產出有意義的報告。原始數據是一個包含多個閱讀記錄的陣列,每條記錄包含:readerId
: 讀者IDtimeSpent
: 閱讀時間(分鐘)titles
: 閱讀的書籍標題陣列
aggregateReadingData
函數,將這些原始記錄合併成每位讀者的摘要報告:- 每位讀者只產出一份報告
totalTime
是該讀者所有記錄的timeSpent
總和uniqueTitles
是該讀者閱讀過的所有不重複書籍標題,按字母順序排序- 報告順序應按照讀者在原始數據中首次出現的順序排列
- 不得修改原始數據
Data Processing
Algorithms
解題思路
1. 需求分析
首先,讓我們分析一下這個問題的核心需求:
- 資料合併:將同一讀者的多條記錄合併為一條
- 時間累加:將同一讀者的閱讀時間相加
- 書籍去重:移除重複的書籍標題並排序
- 保持順序:維持讀者首次出現的順序
- 不可變性:不修改輸入數據
2. 解決方案設計
我們可以將解決方案分為三個主要步驟:
- 初始化數據結構:新增必要的數據結構來追蹤讀者和他們的數據
- 遍歷與合併:處理每條記錄,更新相應讀者的合併數據
- 產出結果:按照原始順序組成最終報告
詳細解析
步驟 1: 初始化數據結構
在這一步,我們新增了兩個關鍵的數據結構:
readerOrder
陣列用於記錄讀者首次出現的順序,這將幫助我們在最終結果中保持原始順序readerMap
是一個 Map,其中鍵是讀者 ID,值是包含總閱讀時間和書籍集合的對象- 我們使用
Set
來存儲書籍標題,因為它能自動去除重複項
步驟 2: 遍歷原始記錄
接下來,我們遍歷每條閱讀記錄,並根據讀者 ID 進行合併:
這段代碼的邏輯是:
- 如果讀者是首次出現,我們新增一個新的記錄並將其 ID 添加到順序陣列中
- 如果讀者已經存在,我們更新其總閱讀時間,並將新的書籍標題添加到集合中
步驟 3: 產出最終報告
最後,我們根據讀者順序產出最終報告:
在這一步:
- 我們遍歷
readerOrder
陣列,確保結果按照讀者首次出現的順序排列 - 對於每位讀者,我們從
readerMap
中獲取其合併數據 - 將
titleSet
轉換為陣列並排序,確保書籍標題按字母順序排列 - 返回符合
ReaderReport
介面的對象
優化考量
1. 時間複雜度
- 遍歷原始記錄:O(n),其中 n 是記錄數量
- 處理書籍標題:O(m),其中 m 是每條記錄中的書籍數量
- 排序書籍標題:O(k log k),其中 k 是每位讀者的唯一書籍數量
- 總體時間複雜度:O(n + r * k log k),其中 r 是唯一讀者數量
2. 空間複雜度
- 讀者順序陣列:O(r)
- 讀者數據 Map:O(r)
- 書籍集合:O(t),其中 t 是所有唯一書籍的總數
- 總體空間複雜度:O(r + t)
3. 效能優化
如果處理大量數據,可以考慮以下優化:
測試案例
實際應用
這種數據合併模式在實際開發中非常常見,例如:
- 用戶行為分析:合併用戶在不同時間點的行為數據
- 內容推薦:基於用戶閱讀偏好產出推薦
- 報表產出:將原始數據轉換為管理層報表