Todos los desafíos
Fácil 0 resueltos 0% de aceptación

Ordenar por una clave elegida

Ordena a las personas por nombre o por edad con un comparador elegido en tiempo de ejecución, resolviendo los empates de forma consistente.

Lo que aprenderás

  • Elegir el orden en tiempo de ejecución
  • Desempatar con una segunda clave
  • Comparar cadenas en orden ordinal

Problema

Ver original (inglés)

En C#, un IComparer<T> es una interfaz: cualquier clase que implemente su método Compare puede indicarle a una ordenación qué elemento va primero. Elegir un comparador distinto cambia el orden sin cambiar la ordenación.

Ordena a las personas por key:

  • name: por nombre (orden ordinal de caracteres, así que las letras mayúsculas van antes que las minúsculas), y por edad cuando los nombres sean iguales.
  • age: por edad, primero la persona más joven, y por nombre cuando las edades sean iguales.

Implementa sort_by_key(names, ages, key).

Entrada

names, ages: Las personas (misma longitud).

key: "name" o "age".

Salida

Devuelve los nombres en orden ordenado.

Restricciones

0 ≤ número de personas ≤ 100,000

0 ≤ edad ≤ 150

Ejemplos

Ejemplo 1
Entrada:
key = "age"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]

Salida esperada:
expected = ["Bo", "Lin", "Ada"]
Entrada:
std::string key = "age";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};

Salida esperada:
std::vector<std::string> expected = {"Bo", "Lin", "Ada"};
Entrada:
string key = "age";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};

Salida esperada:
string[] expected = new string[] {"Bo", "Lin", "Ada"};

Explicación

Bo y Lin tienen ambos 30, así que se ordenan por nombre antes que Ada (36): ["Bo", "Lin", "Ada"].

Ejemplo 2
Entrada:
key = "name"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]

Salida esperada:
expected = ["Ada", "Bo", "Lin"]
Entrada:
std::string key = "name";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};

Salida esperada:
std::vector<std::string> expected = {"Ada", "Bo", "Lin"};
Entrada:
string key = "name";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};

Salida esperada:
string[] expected = new string[] {"Ada", "Bo", "Lin"};

Explicación

Orden alfabético: ["Ada", "Bo", "Lin"].

Cómo abordarlo

Inténtalo primero por tu cuenta y luego abre las pistas una a una.

Pista 1

Ordena pares (name, age) en lugar de dos listas separadas.

Pista 2

La clave elegida da el orden principal; el otro campo desempata.

Pista 3

Compara cadenas en orden ordinal para que las mayúsculas vayan antes que las minúsculas.

Complejidad esperada

tiempo O(n log 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.