Problema
Una app de tareas guarda las tareas en una colección tipada como List<T>. Cada tarea tiene un título y una marca de hecha.
Empieza con una lista vacía y procesa las operaciones, cada una un comando y un título (el título es todo lo que va tras el primer espacio):
add <title>: añade una tarea pendiente al final, salvo que ya exista una con ese título.done <title>: marca esa tarea como hecha (sin efecto si no existe).remove <title>: borra esa tarea (sin efecto si no existe).
Implementa todo_list(operations).
Entrada
operations: Las operaciones. Los títulos pueden tener espacios y se comparan exactamente.
Salida
Devuelve los títulos de las tareas no hechas, en el orden en que se añadieron.
Restricciones
0 ≤ número de operaciones ≤ 10,000
Los títulos tienen de 1 a 50 caracteres
Ejemplos
Entrada:
operations = ["add Buy milk", "add Write report", "done Buy milk", "add Call Ada"]
Salida esperada:
expected = ["Write report", "Call Ada"]
Entrada:
std::vector<std::string> operations = {"add Buy milk", "add Write report", "done Buy milk", "add Call Ada"};
Salida esperada:
std::vector<std::string> expected = {"Write report", "Call Ada"};
Entrada:
string[] operations = new string[] {"add Buy milk", "add Write report", "done Buy milk", "add Call Ada"};
Salida esperada:
string[] expected = new string[] {"Write report", "Call Ada"};
Explicación
Buy milk está hecha, así que solo quedan las otras dos, en el orden en que se añadieron: ["Write report", "Call Ada"].
Entrada:
operations = ["add Gym", "add Gym", "remove Gym", "done Gym"]
Salida esperada:
expected = []
Entrada:
std::vector<std::string> operations = {"add Gym", "add Gym", "remove Gym", "done Gym"};
Salida esperada:
std::vector<std::string> expected = {};
Entrada:
string[] operations = new string[] {"add Gym", "add Gym", "remove Gym", "done Gym"};
Salida esperada:
string[] expected = new string[] {};
Explicación
El segundo add se ignora porque Gym ya existe; al borrarla no queda nada, y done sobre una tarea inexistente no hace nada: [].
Cómo abordarlo
Inténtalo primero por tu cuenta y luego abre las pistas una a una.
Pista 1
Guarda cada tarea como un pequeño record con título y estado.
Pista 2
Busca la tarea por su título exacto antes de añadirla, completarla o borrarla.
Pista 3
Al final conserva solo las tareas no hechas, en orden de inserción.
Complejidad esperada
tiempo O(n²), espacio extra O(n)
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.