Retour aux défis
Facile 0 résolus 0 % de réussite

Trier selon une clé choisie

Trier des personnes par nom ou par âge avec un comparateur choisi à l'exécution, en départageant les égalités de façon cohérente.

Ce que vous allez apprendre

  • Choisir l'ordre de tri à l'exécution
  • Départager les égalités avec une seconde clé
  • Comparer les chaînes en ordre ordinal

Problème

En C#, un IComparer<T> est une interface : toute classe qui implémente sa méthode Compare peut indiquer à un tri quel élément vient en premier. Choisir un comparateur différent change l'ordre sans changer le tri.

Triez les personnes par key :

  • name : par nom (ordre lexicographique ordinal, donc les lettres majuscules viennent avant les minuscules), puis par âge lorsque les noms sont égaux.
  • age : par âge, du plus jeune au plus âgé, puis par nom lorsque les âges sont égaux.

Implémentez sort_by_key(names, ages, key).

Entrée

names, ages: Les personnes (même longueur).

key: "name" ou "age".

Sortie

Retournez les noms dans l'ordre trié.

Contraintes

0 ≤ nombre de personnes ≤ 100,000

0 ≤ âge ≤ 150

Exemples

Exemple 1
Entrée :
key = "age"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]

Sortie attendue :
expected = ["Bo", "Lin", "Ada"]
Entrée :
std::string key = "age";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};

Sortie attendue :
std::vector<std::string> expected = {"Bo", "Lin", "Ada"};
Entrée :
string key = "age";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};

Sortie attendue :
string[] expected = new string[] {"Bo", "Lin", "Ada"};

Explication

Bo et Lin ont tous deux 30 ans, donc ils sont ordonnés par nom avant Ada (36) : ["Bo", "Lin", "Ada"].

Exemple 2
Entrée :
key = "name"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]

Sortie attendue :
expected = ["Ada", "Bo", "Lin"]
Entrée :
std::string key = "name";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};

Sortie attendue :
std::vector<std::string> expected = {"Ada", "Bo", "Lin"};
Entrée :
string key = "name";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};

Sortie attendue :
string[] expected = new string[] {"Ada", "Bo", "Lin"};

Explication

Ordre alphabétique : ["Ada", "Bo", "Lin"].

Comment l'aborder

Essayez d'abord seul, puis ouvrez les indices un par un.

Indice 1

Triez des paires (name, age) plutôt que deux listes séparées.

Indice 2

La clé choisie donne l'ordre principal ; l'autre champ départage les égalités.

Indice 3

Comparez les chaînes en ordre ordinal pour que les majuscules passent avant les minuscules.

Complexité attendue

temps O(n log n), espace supplémentaire O(n)

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.