我最近剛刷完 ZipRecruiter CodeSignal OA ,全程 4 道題,70 分鐘左右完成,拿到了滿分(600/600)。把真實遇到的題目和詳細解析分享出來,希望對正在準備 ZipRecruiter 或其他用 CodeSignal GCA的同學有幫助。

ZipRecruiter CodeSignal OA 概覽
ZipRecruiter 的 OA 屬於典型的 CodeSignal General Coding Framework,難度 LeetCode Easy ~ Medium,前兩題送分,第 3 題需要一點小技巧,第 4 題實現量較大但演算法不難。很多人在 40-50 分鐘內就能滿分透過,關鍵在於時間管理和邊緣情況處理。
ZipRecruiter OA 基本資訊
- 平臺:CodeSignal(部分為 proctored,需要開啟攝像頭 + 麥克風,準備好身份證)。
- 題量與時間:4 道題,70 分鐘(我實際 42 分鐘提交,有人反饋 120 分鐘版本,但多數是 70 分鐘)。
- 評分:總分通常 600 分(新畢業生/早期職位常見),透過所有測試用例即可滿分。
- 難度:Easy ~ Medium。前 1-2 題 Easy,第 3 題 Easy-Medium,第 4 題 Medium(程式碼量大)。
- 推薦做題順序(經典策略):Task 1 → Task 2 → Task 4 → Task 3 前兩題是送分題,第 4 題實現重但無複雜演算法,第 3 題可能藏 prefix sum 或雜湊最佳化技巧。
Task 1:基礎食譜 CRUD 操作
實現無使用者資料的食譜基礎增刪改查功能:
addRecipe(self, name: str, ingredients: list[str], steps: list[str]) -> str | None- 功能:新增一條新食譜,返回其
recipe_id。 recipe_id格式為"recipe" + 序號,序號從 1 開始遞增(如recipe1、recipe2)。- 若已存在同名食譜(不區分大小寫),返回
None。
- 功能:新增一條新食譜,返回其
getRecipe(self, recipe_id: str) -> list[str]- 功能:根據
recipe_id查詢食譜。 - 返回格式:
[name, ingredients_as_string, steps_as_string]。ingredients_as_string:食材列表用逗號拼接的字串,順序與新增時一致。steps_as_string:步驟列表用逗號拼接的字串。
- 若食譜不存在,返回空列表
[]。
- 功能:根據
updateRecipe(self, recipe_id: str, name: str, ingredients: list[str], steps: list[str]) -> bool- 功能:更新指定
recipe_id的食譜資訊。 - 返回值:更新成功返回
True;若食譜不存在,或新名稱與現有食譜衝突(不區分大小寫),返回False。
- 功能:更新指定
Task 2:食譜搜尋與排序
實現按條件搜尋和排序食譜的功能:
searchRecipesByIngredient(self, ingredient: str) -> list[str]- 功能:搜尋包含指定食材的所有食譜(不區分大小寫)。
- 排序規則:先按食材數量升序排列,食材數量相同則按
recipe_id升序排列。 - 返回:匹配的食譜 ID 列表。
listRecipes(self, sort_by: str) -> list[str]- 功能:返回所有食譜的 ID 列表,按指定規則排序。
- 支援的排序選項:
"name":按食譜名稱字典序升序排列,名稱相同則按recipe_id升序。"ingredient_count":按食材數量升序排列,數量相同則按recipe_id升序。
- 無效的排序選項(如
"unknown_sort")預設按"name"排序。
示例
add_recipe("Soup", ["water", "vegetables", "salt"], ["boil", "stir"]) # 返回 "recipe1"
add_recipe("Stew", ["beef", "salt", "vegetables"], ["cook", "serve"]) # 返回 "recipe2"
search_recipes_by_ingredient("salt") # 返回 ["recipe1", "recipe2"](兩者食材數量均為3,按ID升序)
search_recipes_by_ingredient("sugar") # 返回 [](無匹配食譜)
list_recipes("ingredient_count") # 返回 ["recipe1", "recipe2"](食材數量相同,按ID升序)
list_recipes("unknown_sort") # 返回 ["recipe1", "recipe2"](無效選項預設按名稱排序)
Task 3:使用者賬戶與許可權管理
引入使用者系統,支援食譜編輯並記錄編輯次數:
addUser(self, user_id: str) -> bool- 功能:新增新使用者。
- 返回值:新增成功返回
True;若使用者 ID 已存在,返回False。
editRecipe(self, user_id: str, recipe_id: str, new_name: str, new_ingredients: list[str], new_steps: list[str]) -> bool- 功能:使用者編輯指定食譜。所有使用者均可編輯任意食譜,需保證食譜名稱唯一性(不區分大小寫)。
- 返回值:編輯成功返回
True;若使用者 / 食譜不存在,或新名稱與現有食譜衝突,返回False。 - 額外要求:記錄每條食譜的編輯次數。
Task 4:食譜版本控制與回滾
實現食譜的版本歷史記錄與回滾功能:
versionRecipe(self, recipe_id: str) -> list[str]- 功能:返回指定食譜的所有版本記錄,按版本號升序排列。
- 單條版本記錄格式:
"::::"。last_edited_by:編輯者 ID,透過editRecipe修改時為使用者 ID,透過updateRecipe修改時為字串"system"。
- 規則:透過
addRecipe建立的食譜初始無版本記錄,第一次編輯後生成版本歷史;若食譜不存在或從未被編輯過,返回空列表[]。
rollbackRecipe(self, recipe_id: str, version: int) -> bool- 功能:將食譜回滾到指定版本。
- 規則:
- 回滾時會建立一條新的版本記錄,
last_edited_by欄位標記為"rollback",並追加到版本歷史中(原有歷史保持不變)。 - 回滾後,食譜的名稱、食材、步驟恢復為指定版本的狀態。
- 回滾時會建立一條新的版本記錄,
- 返回值:回滾成功返回
True;若食譜不存在、指定版本號不存在,或回滾後名稱與現有食譜衝突,返回False。
示例
add_recipe("Cookies", ["flour", "chocolate"], ["mix", "bake"]) # 返回 "recipe1"
add_user("user1") # 返回 True
add_user("user2") # 返回 True
edit_recipe("user1", "recipe1", "Cookies", ["flour", "chocolate", "sugar"], ["mix", "bake"]) # 返回 True(第一次編輯,生成版本1)
edit_recipe("user2", "recipe1", "Cookies", ["flour", "chocolate", "sugar", "eggs"], ["mix", "bake"]) # 返回 True(第二次編輯,生成版本2)
version_recipe("non_existent_recipe") # 返回 [](食譜不存在)
version_recipe("recipe1") # 返回 ["1:Cookies:flour,chocolate,sugar:mix,bake:user1", "2:Cookies:flour,chocolate,sugar,eggs:mix,bake:user2"]
rollback_recipe("recipe1", 1) # 成功後新增版本3,記錄為 "3:Cookies:flour,chocolate,sugar:mix,bake:rollback"
其他經驗
- 拿滿分不一定 100% 進下一輪(有 600/600 仍被拒的案例),但透過率較高。
- ZipRecruiter OA 相對友好,重點考察仔細實現 + 邊緣處理能力,而非高階演算法。
- 如果你是New Grad,OA 通常自動傳送。
這次 OA 順利透過,後面進入 VO 了(如果有後續會繼續分享)。有同樣面 ZipRecruiter、Capital One、Optiver 等 CodeSignal OA 的同學,歡迎評論區交流具體題目變種或做題心得!
如果大家時間緊張、 proctored 環境不方便、或者想確保 100% 透過所有測試用例,可以參考 ProgramHelp 的專業 OA代寫服務 。 專注 大廠筆試、HackerRank、牛客網、CodeSignal 等平臺的線上評測代寫,透過遠端控制實現無痕操作,確保所有測試用例 100% 透過,不透過不收費。安全可靠,很多同學反饋幫助很大,尤其適合想穩過 OA 的情況。
祝大家 OA 滿分,衝 Offer!