Problema
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
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"].
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.