恭喜 ProgramHelp 學員在最新一輪 Barclays Online Assessment 中斬獲滿分 AC!
巴克萊的 OA 一直以“勸退式難度”聞名,全程部署在 Codility 平臺,題目描述長、邊界情況極多、測試用例異常刁鑽。這次學員遇到的更是 Hard 難度、完全偏底層思維的模擬題,需要實現一個簡化的“記憶體管理器”。這類題完全不同於普通 LeetCode 演算法題,哪怕是熟練工程師也很容易踩坑。
在 ProgramHelp 的系統指導下,學員成功避開所有隱形陷阱,一次 AC。以下是這次 OA 的完整覆盤乾貨。

Barclays Online Assessment 概覽
公司: Barclays(巴克萊)
平臺: Codility
難度: Hard
核心考點: 記憶體管理、狀態維護、模擬系統元件、邊界條件處理、魯棒性程式碼實現
這類系統模擬題千萬不能上來就寫程式碼。只有先設計資料結構,再動手寫邏輯,才能在 Codility 的壓力環境下穩穩透過。
Barclays Online Assessment 獨家真題分享
基礎記憶體分配器(Basic Memory Allocator)
Design a basic memory allocator to manage a memory block of size N bytes.
Implement an alloc method that allocates continuous memory of size 1, 4, or 8 bytes.
Return the starting index of the allocated block, or -1 if no suitable space exists.
思路解析
第一題是熱身,重點在於模擬“找到連續空閒空間”。核心方法:
- 初始化狀態陣列
用一個長度為 N 的陣列 memory_status,0 表示空閒、1 表示佔用。 - 分配邏輯(alloc)
- 順序掃描陣列,尋找長度為 size 的連續空閒區間
- 找到後,將該區間全部改為佔用
- 返回起始索引,否則返回 -1
這種線性掃描的樸素寫法完全可以透過所有測試點。
ProgramHelp 點撥
Codility 的 hidden test 會測“碎片化情況”,手寫連續區間搜尋最可靠。
高階寫法可以使用空閒區間連結串列或點陣圖(BitMap),但不是必要。
關鍵是程式碼必須穩健、狀態一致、無越界風險。
完整記憶體管理器(Full Memory Manager with Free)
Extend the previous allocator to support:
- alloc(size): allocate 1, 4, or 8 bytes
- free(address): free the block previously allocated at ‘address’
You must ensure the address is valid, has not been freed,
and corresponds to the start of an allocated block.
思路解析
第二題的難度明顯升級,加入 free 後如果資料結構設計不當就完全做不下去。
關鍵痛點:free(address) 只告訴你起始地址,卻沒告訴你要釋放多少位元組。
你必須在 alloc 時記錄“後設資料”。
資料結構設計(解決整題的核心)
- memory_status 陣列
繼續記錄每個位元組是否被佔用。 - allocation_records 雜湊表(必不可少)
- key:分配起始地址
- value:分配的空間大小(1/4/8)
分配時寫入記錄,釋放時根據這個記錄判斷釋放範圍。
free(address) 的正確實現
- 檢查 address 是否存在於 allocation_records
- 若不存在:非法地址、重複釋放或中間地址,直接返回錯誤
- 若存在:
- 查出 size = allocation_records[address]
- 將 memory_status[address ~ address+size) 恢復為空閒
- 刪除 allocation_records 的這條記錄
ProgramHelp 點撥
Codility 的隱藏測試會專門攻擊以下情況:
- free 未分配的地址
- free 已釋放的地址
- free 到區間中間位置
- 先 alloc 大塊再釋放造成碎片,測試 alloc 是否還能正常找到小塊空間
如果第一題只寫了最小可行程式碼、卻沒設計記錄結構,這一題一定寫不出來。
FAQ|Barclays Codility OA 常見問題解答
Q1:Barclays 的 Codility OA 難度如何?需要提前準備嗎?
A:難度普遍高於常規 LeetCode 演算法題,尤其喜歡考工程模擬、系統元件設計(如記憶體管理、任務排程、資源分配等)。提前準備非常必要,否則時間壓力和邊界情況很容易把人壓垮。
Q2:Codility 會不會卡效能?線性掃描能過嗎?
A:多數情況下 Codility 的時間要求並不極端,但隱藏測試會驗證碎片化、邊界合法性、重複操作等情況。線性掃描通常能透過,但要注意程式碼穩定性和越界檢查。
Q3:記憶體管理類題要如何避免 free 時找不到大小的問題?
A:必須在 alloc 時記錄“起始地址 → 分配大小”的後設資料。
常用方式是使用 HashMap / Dictionary 儲存,缺少這個結構第二題幾乎不可能做對。
Q4:free(address) 的非法情況有哪些?為什麼容易掛?
A:Codility 會集中攻擊以下場景:
- 釋放從未分配過的地址
- 重複釋放同一地址
- 釋放區間中間的某個位元組
- 分配後碎片化導致下一次 alloc 錯位
如果沒有嚴謹的記錄結構與邊界檢查,程式碼大機率崩潰或返回錯誤。
Q5:用點陣圖(bitmap)還是陣列記錄狀態更好?
A:對 Codility 來說,兩者都能過。
- 陣列簡單直接,便於寫出穩定程式碼
- 點陣圖更節省空間,但需要額外位運算
除非題目特別強調 space optimization,否則陣列方案更穩。
打破首輪淘汰魔咒,穩拿面試入場券!
面對大廠越來越刁鑽、題庫深不見底的Online Assessment,你是否也經歷過被冷門Hard題卡住的絕望,或是擔心時間不夠而錯失良機?別讓OA成為你求職路上無法跨越的第一道坎。
ProgramHelp重磅推出OA無痕聯機助攻服務。我們採用業界領先的安全連線技術,全程靜默執行,在完全不干擾你正常操作的前提下,完美避開各類主流OA平臺的檢測機制。資深大廠導師團隊實時線上,化身你的“最強幕後外腦”。無論是Codility的底層模擬坑題、HackerRank的隱藏神題,還是CodeSignal的高壓速通要求,我們都能用最穩健的程式碼和思路帶你從容過關。
別再孤軍奮戰面對未知的難題,把壓力和風險交給我們,你只需要調整好狀態,準備迎接 Next Round 的面試通知!立即聯絡我們,鎖定你的專屬助攻時段,讓OA不再是攔路虎