恭喜 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不再是拦路虎