cswork / libraryOpen practice workspace

Articles

台積電 HackerRank 準備指南:看懂測驗邀請、練習程式題與檢查提交

台積電 HackerRank 準備先核對自己的邀請信:期限、時區、語言、工具與提交規則。用原創輸入題練解析、邊界測試與效能,不把面經當成固定題型或錄取門檻。

收到台積電 HackerRank 測驗邀請後,最重要的準備不是猜別人考了哪三題,而是看懂你自己的測驗規格,再確認能在指定環境完成讀題、實作、測試與提交。邀請的期限、作答時間、允許語言和工具規則,會直接影響你該怎麼練習。

本文適用於已收到或正在等待相關程式測驗的候選人。它不提供台積電的私有題目,也不假設所有 IT、實習或軟體職缺都使用同一份考卷。

先建立證據邊界:面經不是你的測驗規格

台積電官方招募流程說明,面試前可能需要完成評估,面試安排依職缺需求與結果而異。這只能支持「可能有評估」,不能支持固定 HackerRank 題數、時長或分數門檻。

另外,台積電 IT 招募頁列出軟體、基礎建設、資料與其他 IT 職務。這些工作不應被合併成一個通用考試版本。先確認邀請對應的職缺名稱、地點與申請編號,再把面經當成補充線索。

公開候選人報告也有不同感受。一篇 Dcard 實習測驗分享描述前兩題較容易、後一題較難;另一篇 IT 面試分享用另一種難度標籤描述自己的經驗。這些是個人報告,不是官方題型分類;本次可讀頁面也未呈現足以確認同一招募周期的日期,因此不把它們當作最新一季的統一流程。

這帶來一個實際結論:不要用 EMM、MMH 這類簡寫決定全部準備。你需要知道的是,自己能否處理輸入、選擇合適資料結構、找出邊界錯誤,以及在時間限制下交出最可靠的版本。任何「全過一定進下一關」的說法,也不能取代官方通知。

把邀請信轉成一張規則表

先在不啟動正式計時的前提下閱讀邀請與可見說明。HackerRank 官方候選人指南介紹測驗登入、說明頁面與可能提供的 Sample Test。練習測驗是否可用,仍要看你收到的設定。

要確認的欄位記錄方式不清楚時先做什麼
職缺與邀請人職稱、地點、申請編號、寄件聯絡方式與自己的申請紀錄核對
截止時間日期、時間、時區問清楚能否在期限前開始,或必須完成
正式時長以說明頁面為準不拿其他人的時長代替
題目與區段程式、選擇題或其他形式只依可見說明安排練習
語言與環境可選語言、版本、模板或專案型態先測熟悉語言的基本輸入輸出
工具與監考網頁查詢、筆記、AI、鏡頭等規則沒寫明不等於允許,向聯絡窗口確認
故障求助平台支援與招募聯絡方式測驗前就保存非機密聯絡資訊

「截止時間」與「作答時長」是不同限制。假設信上寫了某個截止日期,你仍不能自行推定只要那天點進去就有完整時長。這是需要確認的歧義,不是本文替你解讀出的公司政策。

也不要為了看看畫面就按正式 Start。可以先做官方提供的練習,確認瀏覽器、鍵盤與語言操作;正式測驗是否能暫停、切換題目或返回前題,應以自己的說明為準。若缺少明確規則,提早詢問比在計時中猜測更安全。

練程式前,先分辨函式模板與標準輸入

HackerRank 的題目可能提供函式模板,由平台程式讀取輸入並呼叫你的函式;也可能要你自己讀取標準輸入,再寫出標準輸出。官方程式作答指南說明模板、Run、Submit 與自訂測試。不要看到 HackerRank 就認定每題都只需要 input(),或每題都只需要 return。

有模板時,先檢查函式名稱、參數型別、回傳型別,以及不可編輯的程式區段。平台已經解析過輸入,你若又在函式內讀一次,可能讀不到預期資料。相反地,沒有模板而要求完整程式時,只定義一個函式卻不呼叫,也可能沒有任何輸出。

先選定允許且熟悉的語言,再開始主要實作。官方指南提醒,切換語言可能重設編輯器內容。正式測驗中的保存、複製與備份操作,仍須遵守邀請的完整性規則;不要為保護程式而把私有題目或內容上傳到外部工具。

語言版本也影響標準函式庫的可用功能。練習時確認你會處理數字轉換、字串分割、排序、集合與映射,而不是到考場才查一個陌生語法。優先選能可靠完成題目的語言,不必為了想像中的速度優勢臨時換語言。

原創演練:解析輸入與計數邏輯分開檢查

以下是本文自製題,不是台積電或 HackerRank 私有考題。輸入的第一個整數 n 表示資料長度,接著有 n 個整數;數值可跨行,並以空白分隔。輸出相鄰兩筆資料中,後一筆「嚴格大於」前一筆的次數。練習規格允許 n 為 0。

例如:

5
4 4 7 2 3

結果為 2:4 到 4 不算;4 到 7 算一次;7 到 2 不算;2 到 3 再算一次。這不是計算正數數量,也不是求最長遞增子序列。先用手算固定這個差別,再寫程式。

import sys

def count_rises(values):
    return sum(values[i] > values[i - 1]
               for i in range(1, len(values)))

def solve(text):
    tokens = text.split()
    n = int(tokens[0])
    values = [int(token) for token in tokens[1:]]
    if n < 0 or len(values) != n:
        raise ValueError("invalid practice input")
    return str(count_rises(values))

if __name__ == "__main__":
    print(solve(sys.stdin.read()))

這份練習把兩個問題分開:solve 處理格式,count_rises 處理規則。合法輸入至少包含 n;完全沒有輸入不在本題契約內。長度檢查用於本地練習,不能據此假設正式題目也要求以例外處理非法資料。

Python 的布林值可在這裡累加;條件為真就加 1,為假就加 0。比較從索引 1 開始,因為第一筆沒有前一筆。n 為 0 或 1 時沒有任何相鄰配對,結果都是 0。

計數為 O(n) 時間、O(1) 額外空間;但整份程式先讀入並切分文字,所以總體輸入保存使用線性空間。說明複雜度時要交代範圍,不能只看小函式就宣稱整個解法不需要額外記憶體。

用五種反例檢查提交前的假設

樣例通常只能示範部分行為。HackerRank 的 Sample Test Cases 說明區分樣例與隱藏測試;通過已看見的例子,不等於隱藏邊界與效能也正確。不要根據一個綠色結果推定整題完成。

自製案例預期輸出錯誤版本可能怎麼失敗
00直接讀第一個值而越界
1 後接 90把單筆當成一次上升
3 後接 2 2 20用 >= 把相等計入
4 後接 -4 -1 -3 02只計正數,漏掉負數之間的上升
5 後接跨行的 4 4 7 2 32假設所有資料必須在第二行

再補一個全遞增序列與全遞減序列,可以分別檢查 n−1 與 0 的極端結果。若正式題目限制 n 至少為 1,就不要把自製題的 n=0 規則硬加進去;測試是驗證規格,不是替規格加新功能。

若只有大輸入超時,先估計重複工作。這題每對相鄰值只需要比較一次,不需要對每筆再掃描全部資料。但在其他題目裡,排序、雜湊表或前綴和是否合適,必須由查詢方式與限制決定,不是見到超時就一律「加 hash」。

若所有案例都失敗,先查輸入解析、入口與輸出型別,而不是馬上優化演算法。只在部分案例失敗時,把最小反例手算一遍。能分類問題,才不會在計時中一再改錯地方。

準備時間有限時,按缺口安排,而不是追題數

先做一次短診斷:用熟悉語言完成一個字串或陣列題,包含讀題、測試與提交核對。若思路正確卻卡在輸入,就練解析;若邊界反覆錯,就練反例;若小資料正確、大資料超時,就練複雜度與資料結構。

至少做一回從空白檔案到完整輸出的限時演練。時長可由自己設定,正式模擬則依邀請調整;本文不替台積電指定分鐘數。練完要回看時間花在哪裡,區分讀題過久、實作卡住與無目的除錯。

如果題目可切換,是否先做較有把握的題,要看測驗規則。即使採用這個策略,也應先交出已經測過的版本,再考慮修改。把最後一段時間全部用來重寫尚未證實的解法,可能丟掉原本可用的成果。

下列題目是一般能力練習,不是台積電題庫或命中預測。選擇它們,是為了覆蓋測試設計、字串與陣列、命令解析及效能;不要把題目來源公司的流程當成台積電流程。

練習本文對應的準備缺口
Design comprehensive OA test cases樣例之外的規則與邊界
Solve String Arrays and Row Deduplication資料表示、重複值與順序
Solve three algorithmic tasks in Python進階練習:分別估計不同子任務的成本
Simulate a Stack from Push, Pop and End-of-Input Commands命令、結束條件與輸出契約
Optimize algorithms and validate inputs說明限制、優化與驗證順序

陣列、字串與映射:每種練習都要有明確目的

除了上升計數,還可以準備三種小型練習:陣列中的重複值、字串中的分段規則,以及依識別子累加的紀錄。它們是本文建議的通用技能,不是台積電已公布的考試範圍。

陣列去重時,先確認保留規則。如果要求第一次出現的順序,集合可協助判斷是否看過,但仍要另外保留結果順序。若改成按數值排序,才需要另一種輸出整理方式。兩個題目的資料相同,正確答案卻可能不同。

字串題先確認字元、空白與分隔符號的意思。把每一行都 split() 可能會破壞需要保留的空白;直接按逗號切開,也不能處理所有真正的 CSV 格式。正式題目若保證格式簡單,可以使用較簡單的解析,但要知道自己依賴哪個保證。

映射題則要分清楚新增、覆蓋與累加。假設本文自製練習有 A 2、B 1、A 3 三筆紀錄,若規則是累加,A 的結果應為 5;若規則是最後一筆覆蓋,才會是 3。先把規則寫成一個小例子,比先決定資料結構更重要。

每種練習都至少加一個能分辨兩種解讀的案例。這樣你練的不是「曾經看過某題」,而是發現程式與規格不一致的能力。面經可以讓你想起需要複習某個工具,但不能替你決定題目裡的業務規則。

看到長題目時,先找可驗證的最小工作

長篇敘述容易讓人感覺整題都很難。先抽出輸入欄位、狀態、操作與輸出,再手算一個只有兩三筆資料的例子。若連最小例子都無法解釋,繼續堆程式通常只會把疑問藏起來。

例如題目要求依順序處理命令,可以先確認第一個命令如何改變狀態,下一個命令需要讀到什麼,以及最後要輸出哪個資訊。這與讀完全文就同時實作所有分支不同:你先建立一條能從輸入走到結果的路徑,再逐步增加已理解的規則。

小範圍跑通後,用原有測試保護它。新增一個分支時,先加對應案例,再重新執行舊案例。如果後續條件改變了原本的資料模型,就明確修正模型;但不要只因為新的要求看起來複雜,就把所有可用程式一次刪掉重寫。

卡住時可以記下兩個版本:「我目前能確定的規格」與「我還不確定的規格」。有面試官時可提出具體問題;沒有即時提問管道時,優先依文字和範例核對,不要透過未被允許的外部工具詢問私有題目。

這種練習也能讓考後檢討更精準。不是寫「第三題不會」,而是記錄「輸出順序理解不清」、「解析正常但狀態更新錯」、「知道方法卻沒有時間驗證」。每一種原因的下一次練習都不同。

最後提交與技術故障:確認事實,不猜結果

提交前核對正在使用的語言、函式入口、回傳或輸出格式,以及最後修改後是否重新執行。官方指南區分 Run 與 Submit;不要只執行成功就離開。以你目前介面顯示的提交狀態為準。HackerRank 官方指南

除錯輸出也要依題目型態處理。官方指南說明,函式型題目可能有獨立 Debug Output;若題目直接比對列印結果,多印文字可能破壞輸出。因此最終版本應移除不必要的除錯訊息,避免靠猜測認定它一定不影響分數。

若發生編輯器、網路或提交故障,記錄發生時間、可見錯誤與測驗識別資訊,透過提供的支援與招募聯絡方式詢問。不公開私有題目,也不自行重開另一個帳號或測驗。是否可以補考或延長期限,只能由對方確認。

考後看到通過案例數或分數,也不能自行推定已獲得面試或錄取。保留可見的完成紀錄,依正式通知追蹤。真正能帶往下一次測驗的是你的錯誤診斷:哪個規格讀錯、哪個輸入沒測、哪段工作超時,以及下一次怎麼預防。

資料來源與延伸閱讀