Easy 0 solved 0% acceptance

To-Do List

Keep a list of tasks: add them, mark them done, remove them and report what is still pending.

What you'll learn

  • Keep tasks with a title and a done flag
  • Find an item by title before changing it
  • Filter the items that are still pending

Problem

A to-do app keeps tasks in a typed collection such as List<T>. Each task has a title and a done flag.

Start with an empty list and process the operations, each a command and a title (the title is everything after the first space):

  • add <title>: add a pending task at the end, unless a task with that title already exists.
  • done <title>: mark that task as done (no effect if it does not exist).
  • remove <title>: delete that task (no effect if it does not exist).

Implement todo_list(operations).

Input

operations: The operations. Titles may contain spaces and are compared exactly.

Output

Return the titles of the tasks that are not done, in the order they were added.

Constraints

0 ≤ number of operations ≤ 10,000

Titles have 1 to 50 characters

Examples

Example 1
Input:
operations = ["add Buy milk", "add Write report", "done Buy milk", "add Call Ada"]

Expected output:
expected = ["Write report", "Call Ada"]
Input:
std::vector<std::string> operations = {"add Buy milk", "add Write report", "done Buy milk", "add Call Ada"};

Expected output:
std::vector<std::string> expected = {"Write report", "Call Ada"};
Input:
string[] operations = new string[] {"add Buy milk", "add Write report", "done Buy milk", "add Call Ada"};

Expected output:
string[] expected = new string[] {"Write report", "Call Ada"};

Explanation

Buy milk is done, so only the other two remain, in the order they were added: ["Write report", "Call Ada"].

Example 2
Input:
operations = ["add Gym", "add Gym", "remove Gym", "done Gym"]

Expected output:
expected = []
Input:
std::vector<std::string> operations = {"add Gym", "add Gym", "remove Gym", "done Gym"};

Expected output:
std::vector<std::string> expected = {};
Input:
string[] operations = new string[] {"add Gym", "add Gym", "remove Gym", "done Gym"};

Expected output:
string[] expected = new string[] {};

Explanation

The second add is ignored because Gym already exists; removing it leaves nothing, and done on a missing task does nothing: [].

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

Store each task as a small record of title and done.

Hint 2

Look a task up by its exact title before adding, completing or removing it.

Hint 3

At the end keep only the tasks that are not done, in insertion order.

Expected complexity

O(n²) time, O(n) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.