I just finished it recently ZipRecruiter CodeSignal OA, a total of 4 questions, took about 70 minutes to complete, and received a perfect score (600/600). I will share the real problems encountered and detailed analysis, hoping to be helpful to students who are preparing for ZipRecruiter or other students using CodeSignal GCA.

ZipRecruiter CodeSignal OA Overview
ZipRecruiter's OA belongs to the typical CodeSignal General Coding Framework, with a difficulty level of LeetCode Easy ~ Medium. Points are awarded for the first two questions, the third question requires a little skill, and the fourth question requires a large amount of implementation but the algorithm is not difficult. Many people get a perfect pass in 40-50 minutes, the key is time management and edge case handling.
ZipRecruiter OA basic information
- Platform: CodeSignal (part of it is proctored, you need to turn on the camera + microphone, and prepare your ID card).
- Question amount and time: 4 questions, 70 minutes (I actually submitted it in 42 minutes, someone reported a 120-minute version, but most are 70 minutes).
- Score: Total marks are usually 600 points (common for new graduates/early stage positions), with full marks achieved by passing all test cases.
- Difficulty:Easy~Medium. The first 1-2 questions are Easy, the 3rd question is Easy-Medium, and the 4th question is Medium (large amount of code).
- Recommended order of questions(Classic strategy): Task 1 → Task 2 → Task 4 → Task 3. The first two questions are for free points. Question 4 implements a heavy but not complicated algorithm. Question 3 may hide prefix sum or hash optimization techniques.
Task 1: Basic recipe CRUD operations
Implement basic addition, deletion, modification and query functions of recipes without user data:
AddRecipe(self, name: str, ingredients: list[str], steps: list[str]) -> str | None- Function: Add a new recipe and return its
Recipe_id. Recipe_idThe format is"recipe" + serial number, the sequence number starts from 1 and increases (such asRecipe1,Recipe2).- If a recipe with the same name already exists (case-insensitive), return
None.
- Function: Add a new recipe and return its
GetRecipe(self, recipe_id: str) -> list[str]- Function: According to
Recipe_idCheck out the recipe. - Return format:
[name, ingredients_as_string, steps_as_string].Ingredients_as_string: The ingredient list is a string concatenated with commas, in the same order as when added.Steps_as_string: The step list is a string concatenated with commas.
- If the recipe does not exist, an empty list is returned
[].
- Function: According to
UpdateRecipe(self, recipe_id: str, name: str, ingredients: list[str], steps: list[str]) -> bool- Function: update specified
Recipe_idRecipe information. - Return value: Update successfully returned
True;If the recipe does not exist, or the new name conflicts with an existing recipe (not case sensitive), returnFalse.
- Function: update specified
Task 2: Recipe search and sorting
Implement the function of searching and sorting recipes by conditions:
SearchRecipesByIngredient(self, ingredient: str) -> list[str]- Function: Search all recipes containing specified ingredients (case insensitive).
- Sorting rules: First, sort by the quantity of ingredients in ascending order. If the quantity of ingredients is the same, sort by
Recipe_idSort in ascending order. - Returns: a list of matching recipe IDs.
ListRecipes(self, sort_by: str) -> list[str]- Function: Returns a list of IDs of all recipes, sorted by specified rules.
- Supported sorting options:
"name": Arrange in ascending dictionary order by recipe name. If the names are the same, sort them in ascending order.Recipe_idAscending order."ingredient_count": Arrange in ascending order by the quantity of ingredients. If the quantities are the same, sort byRecipe_idAscending order.
- Invalid sort option (such as
"unknown_sort") default press"name"Sort.
Example
Add_recipe("Soup", ["water", "vegetables", "salt"], ["boil", "stir"]) # Return "recipe1"
add_recipe("Stew", ["beef", "salt", "vegetables"], ["cook", "serve"]) # Return "recipe2"
search_recipes_by_ingredient("salt") # Return ["recipe1", "recipe2"] (the number of ingredients in both is 3, in ascending order by ID)
search_recipes_by_ingredient("sugar") # Return [] (no matching recipe)
list_recipes("ingredient_count") # Return ["recipe1", "recipe2"] (the same number of ingredients, in ascending order by ID)
list_recipes("unknown_sort") # Return ["recipe1", "recipe2"] (invalid options default to sorting by name)
Task 3: User account and permission management
Introduce the user system to support recipe editing and record the number of edits:
AddUser(self, user_id: str) -> bool- Function: Add new user.
- Return value: Returned successfully after adding
True;If the user ID already exists, returnFalse.
EditRecipe(self, user_id: str, recipe_id: str, new_name: str, new_ingredients: list[str], new_steps: list[str]) -> bool- Function: User edits specified recipes. All users can edit any recipe, and the recipe name must be unique (not case-sensitive).
- Return value: Returned successfully after editing
True;If the user/recipe does not exist, or the new name conflicts with an existing recipe, returnFalse. - Additional requirement: Record the number of edits for each recipe.
Task 4: Recipe version control and rollback
Implement version history and rollback functions for recipes:
VersionRecipe(self, recipe_id: str) -> list[str]- Function: Returns all version records of the specified recipe, sorted by version number in ascending order.
- Single version record format:
"::::".Last_edited_by: Editor ID, viaEditRecipeWhen modifying, it is the user ID, passedUpdateRecipeString when modified"system".
- Rules: Pass
AddRecipeThe created recipe has no version record initially, and a version history is generated after the first edit; if the recipe does not exist or has never been edited, an empty list is returned.[].
RollbackRecipe(self, recipe_id: str, version: int) -> bool- Function: Roll back the recipe to the specified version.
- Rule:
- A new version record will be created when rolling back.
Last_edited_byFields are marked"rollback", and appended to the version history (the original history remains unchanged). - After rollback, the name, ingredients, and steps of the recipe are restored to the state of the specified version.
- A new version record will be created when rolling back.
- Return value: Rollback returns successfully
True;If the recipe does not exist, the specified version number does not exist, or the name conflicts with the existing recipe after rollback, returnFalse.
Example
Add_recipe("Cookies", ["flour", "chocolate"], ["mix", "bake"]) # Return "recipe1"
add_user("user1") # Return True
add_user("user2") # Return True
edit_recipe("user1", "recipe1", "Cookies", ["flour", "chocolate", "sugar"], ["mix", "bake"]) # Return True (first edit, generate version 1)
edit_recipe("user2", "recipe1", "Cookies", ["flour", "chocolate", "sugar", "eggs"], ["mix", "bake"]) # Return True (second edit, generate version 2)
version_recipe("non_existent_recipe") # Return [] (recipe does not exist)
version_recipe("recipe1") # Return ["1:Cookies:flour,chocolate,sugar:mix,bake:user1", "2:Cookies:flour,chocolate,sugar,eggs:mix,bake:user2"]
rollback_recipe("recipe1", 1) # After success, add version 3, recorded as "3:Cookies:flour,chocolate,sugar:mix,bake:rollback"
Other experiences
- Getting full marks does not necessarily mean 100% admission to the next round (there are 600/600 cases that are still rejected), but the passing rate is higher.
- ZipRecruiter OA is relatively friendly and focuses on careful implementation + edge processing capabilities rather than high-order algorithms.
- If you are a New Grad, OA is usually sent automatically.
This time I passed the OA successfully and later entered the VO (will continue to share if there is any follow-up). If you have the same experience with CodeSignal OA such as ZipRecruiter, Capital One, Optiver, etc., please feel free to share specific question variants or experience in the comment area!
If you are pressed for time, the proctored environment is inconvenient, or you want to ensure that all test cases pass 100%, you can refer to ProgramHelp’s professional OA writing service . Focus on online evaluation ghostwriting for Dachang Written Test, HackerRank, Niuke.com, CodeSignal and other platforms, and achieve traceless operation through remote control to ensure that all test cases pass 100%. If they fail, there will be no charge. It is safe and reliable, and many students have given feedback that it is very helpful. It is especially suitable for those who want to overcome OA.
I wish everyone perfect scores for OA and get an offer!