Alle Herausforderungen
Einfach 0 gelöst 0% Erfolgsquote

Nach einem gewählten Schlüssel sortieren

Sortiere Personen nach Name oder Alter mit einem zur Laufzeit gewählten Comparer und löse Gleichstände einheitlich auf.

Das lernst du

  • Die Sortierreihenfolge zur Laufzeit wählen
  • Gleichstände mit einem zweiten Schlüssel auflösen
  • Strings ordinal vergleichen

Problem

In C# ist IComparer<T> ein Interface: Jede Klasse, die seine Methode Compare implementiert, kann einer Sortierung sagen, welches Element zuerst kommt. Ein anderer Comparer ändert die Reihenfolge, ohne die Sortierung zu ändern.

Sortiere die Personen nach key:

  • name: nach Name (ordinale Zeichenreihenfolge, also Großbuchstaben vor Kleinbuchstaben) und bei gleichen Namen nach Alter.
  • age: nach Alter, die Jüngsten zuerst, und bei gleichem Alter nach Name.

Implementiere sort_by_key(names, ages, key).

Eingabe

names, ages: Die Personen (gleiche Länge).

key: "name" oder "age".

Ausgabe

Gib die Namen in sortierter Reihenfolge zurück.

Einschränkungen

0 ≤ Anzahl der Personen ≤ 100,000

0 ≤ Alter ≤ 150

Beispiele

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

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

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

Erwartete Ausgabe:
string[] expected = new string[] {"Bo", "Lin", "Ada"};

Erläuterung

Bo und Lin sind beide 30 und werden nach Name vor Ada (36) einsortiert: ["Bo", "Lin", "Ada"].

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

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

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

Erwartete Ausgabe:
string[] expected = new string[] {"Ada", "Bo", "Lin"};

Erläuterung

Alphabetische Reihenfolge: ["Ada", "Bo", "Lin"].

So gehst du vor

Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.

Hinweis 1

Sortiere Paare aus (name, age) statt zweier getrennter Listen.

Hinweis 2

Der gewählte Schlüssel bestimmt die Hauptordnung; das andere Feld löst Gleichstände.

Hinweis 3

Vergleiche Strings ordinal, damit Großbuchstaben vor Kleinbuchstaben stehen.

Erwartete Komplexität

Zeit O(n log n), zusätzlicher Speicher O(n)

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.