Fácil 0 resueltos 0% de aceptación

Lista de tareas

Lleva una lista de tareas: añádelas, márcalas como hechas, elimínalas e informa de las pendientes.

Lo que aprenderás

  • Guardar tareas con título y marca de hecha
  • Buscar un elemento por título antes de cambiarlo
  • Filtrar los elementos aún pendientes

Problema

Ver original (inglés)

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

Ejemplo 1
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"].

Ejemplo 2
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.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.