老實說,這次 HRT OA 難度不算高,尤其是對我這種已經刷過很多 TikTok、Jane Street、Citadel 等量化/高頻交易公司 OA 的人來說,題目非常熟悉,整體體驗相當輕鬆。以下我把這次 OA 的真實狀況、題目特色解題思路詳細分享給大家,希望能幫到正在準備 HRT OA 的同學。

HRT OA 整體狀況
- 平臺:CodeSignal
- 題量:4 道 Coding 題
- 時長:90 分鐘(我實際上只花了 13 分鐘)
- 難度:Easy ~ Medium,整體友好
HRT 的 OA 風格和 TikTok 比較接近,題目以字串、陣列、數學模擬、簡單貪心/DP 為主,程式碼量不大,但需要思路清晰、邊界處理穩。
題目 1:網站評分紀錄
題目描述
你給喜歡的網站評分,初始分數為 1500。每次分數變化都記錄在數組 diffs 中(正數加分,負數減分)。
請回傳一個數組 [最高評分, 目前評分]。
例子
輸入:diffs = [100, -200, 350, 100, -600]
過程:
- 初始:1500
- 1500 + 100 = 1600
- 1600 – 200 = 1400
- 1400 + 350 = 1750
- 1750 + 100 = 1850 (最高)
- 1850 – 600 = 1250 (目前)輸出:
[1850, 1250]
解題思路
- 初始化
current = 1500,max_rating = 1500 - 遍歷
diffs,每次更新current,並更新max_rating - 最後返回
[max_rating, current]
Python 程式碼
def solution(diffs):
current = 1500
max_rating = current
for d in diffs:
current += d
if current > max_rating:
max_rating = current
return [max_rating, current]
題目 2:穿梭機行程時間計算
題目描述
你需要在星球 Alpha 和 Beta 之間往返完成 missions 次任務(每次任務:Alpha→Beta→Alpha)。
alpha2beta:從 Alpha 出發的穿梭機出發時間(依時間順序排列),單程耗時 100 個時間單位。beta2alpha:從 Beta 出發的穿梭機出發時間(依時間順序排列),單程耗時 100 個時間單位。每次都選擇最早可搭乘的班次。請計算完成所有任務的總時間。
例子
輸入:alpha2beta = [0, 200, 500], beta2alpha = [99, 210, 450], missions = 1
過程:
- 坐 Alpha 0 點的穿梭機,100 到達 Beta
- 在 Beta 最早能搭 210 出發的穿梭機,310 回到 Alpha輸出:
310
解題思路
- 維護當前時間
time = 0 - 循環
missions次:- 找到第一個
>= time的alpha2beta班次,到達 Beta 的時間是班次時間 + 100 - 用到達 Beta 的時間,找第一個
>= 到達Beta時間的beta2alpha班次,回到 Alpha 的時間是班次時間 + 100 - 更新
time回到 Alpha 的時間
- 找到第一個
- 返回最終的
time
Python 程式碼
def solution(alpha2beta, beta2alpha, missions):
time = 0
for _ in range(missions):
# 去程:找第一個 >= 目前時間的班次
for dep in alpha2beta:
if dep >= time:
time = dep + 100 # 到達Beta
break
# 回程:找第一個 >= 到達Beta時間的班次
for dep in beta2alpha:
if dep >= time:
time = dep + 100 # 回到Alpha
break
return time
題目 3:報紙排版
題目描述
給定 paragraphs(二維數組,每個子數組是一段的文字區塊)和 width(每行最大字元數,不含邊框),需要產生居中對齊、有星號邊框的報紙頁面:
- 每段從新行開始,文字區塊用空格連接,不能拆分單一文字區塊。
- 若一行文字(含空格)長度小於
width,需要居中:- 剩餘空間為偶數:前後空格數相同
- 剩餘空間為奇數:前面比後面少一個空格(或題目描述前面和後面相等,多的一個放後面)
- 外圍用
*做邊框,傳回每一行的字串陣列。
解題思路
- 文字分行:
- 遍歷每個段落,依照規則把文字區塊拼成一行,長度不超過
width - 文字區塊之間用空格連接
- 遍歷每個段落,依照規則把文字區塊拼成一行,長度不超過
- 居中處理:
- 計算剩餘空格
pad = width - len(line) - 前空格數
left = pad // 2,後空格數right = pad - left - 產生居中後的行
- 計算剩餘空格
- 加上邊框:
- 首尾行:
*重複width + 2次 - 中間行:
*+ 居中後的文字 +*
- 首尾行:
Python 程式碼
def solution(paragraphs, width):
lines = []
# 步驟1:分行
for para in paragraphs:
current_line = []
current_len = 0
for chunk in para:
if not current_line:
# 新行直接加
current_line.append(chunk)
current_len = len(chunk)
else:
needed = current_len + 1 + len(chunk)
if needed <= width:
current_line.append(chunk)
current_len = needed
else:
# 結束目前行
lines.append(' '.join(current_line))
current_line = [chunk]
current_len = len(chunk)
if current_line:
lines.append(' '.join(current_line))
# 步驟2:居中
centered = []
for line in lines:
pad = width - len(line)
left = pad // 2
right = pad - left
centered_line = ' ' * left + line + ' ' * right
centered.append(centered_line)
# 步驟3:加上邊框
border = '*' * (width + 2)
result = [border]
for line in centered:
result.append('*' + line + '*')
result.append(border)
return result
題目 4:鋸齒序列子數組計數
題目描述
定義一個鋸齒序列:相鄰元素的奇偶性交替變化(如:奇 – 偶 – 奇 – 偶… 或 偶 – 奇 – 偶 – 奇…)。
給定數組 Arr,統計所有連續子數組中,滿足鋸齒序列條件的子數組數量(長度≥1)。
例子
arr = [1,3,5,7,9]:所有元素都是奇數,只有長度為 1 的子數組滿足條件 → 答案5arr = [1,2,1,2,1]:所有連續子數組都滿足條件 → 總數5*(5+1)/2 = 15arr = [1,2,3,7,6,5]:不滿足條件的位置是3和7(都是奇數),所以分段統計:[1,2,3]:長度 3,子數組數3*4/2=6[7,6,5]:長度 3,子數組數3*4/2=6合計12
解題思路
- 關鍵觀察:連續子數組是否為鋸齒序列,取決於相鄰元素的奇偶性是否交替。
- 先把陣列轉換成奇偶性數組(0 = 偶,1 = 奇)
- 再轉換成 “奇偶性是否改變” 的陣列:
diff[i] = 1 if arr[i]%2 != arr[i+1]%2 else 0
- 找到
diff數組中連續為1的段,設某段長度為L,則該段對應的鋸齒子數組數量為(L+1)*(L+2)//2- 例如
L=2(3 個元素,2 次奇偶交替),子數組數3*4/2=6
- 例如
- 遍歷
diff數組,統計所有連續段的貢獻,就是最終答案。
Python 程式碼
def solution(arr):
if not arr:
return 0
# 轉換為奇偶數組
parity = [x % 2 for x in arr]
n = len(parity)
total = 0
current_length = 1 # 目前連續鋸齒序列的長度
for i in range(1, n):
if parity[i] != parity[i-1]:
current_length += 1
else:
# 結算當前段落的貢獻
total += current_length * (current_length + 1) // 2
current_length = 1
# 加上最後一段的貢獻
total += current_length * (current_length + 1) // 2
return total
備戰心得與建議
題型熟悉度最重要 HRT、TikTok、Jane Street 這類公司的 OA 題庫重合度較高。建議大家平時多刷 CodeSignal 的 Arcade 和 Company Tagged 題目,尤其是字串、陣列、貪心、DP 四大類。
速度與準確性並重 雖然題目不難,但一定要注意邊界條件(空數組、空字串、單元素、最大值等)。我每次練習都會強制自己先寫註釋,理清楚思緒再動手。
養成每天刷題的習慣 我最近幾乎每天都做 1-2 份完整 OA(包括 HRT、TikTok、Citadel 等),熟悉了題型和節奏後,真實考試時心態會非常穩。
如果 OA 和 VO 沒把握 對於 OA 穩定性要求高、VO 壓力大的同學,可以考慮一些實戰輔助支援。Programhelp 在這方面經驗較豐富,他們的學長做過很多家大廠的 OA 和 VO 輔導,能提供針對性的思路指導。