Alle Herausforderungen
Einfach 0 gelöst 0% Erfolgsquote

Kunden und Bestellungen verbinden

Verbinde Kunden wie mit LINQ Join mit ihren Bestellungen und melde den Gesamtumsatz jedes Kunden.

Das lernst du

  • Zwei Collections über einen gemeinsamen Schlüssel verbinden
  • Werte pro Gruppe summieren
  • Nach einem Wert sortieren und Gleichstände per Name lösen

Problem

LINQs Join ordnet Elemente aus zwei Folgen über einen gemeinsamen Schlüssel zu, ähnlich wie ein Datenbank-Join. Hier werden Kunden über die Kunden-ID mit ihren Bestellungen verbunden.

Kunde i hat die ID customer_ids[i] und den Namen customer_names[i]. Jede Bestellung ist [customer_id, amount].

Verbinde beide: Addiere für jeden Kunden mit mindestens einer Bestellung die Beträge seiner Bestellungen. Kunden ohne Bestellungen fallen weg, und Bestellungen mit unbekannter Kunden-ID werden ignoriert.

Implementiere join_customers_orders(customer_ids, customer_names, orders).

Eingabe

customer_ids, customer_names: Die Kunden (IDs sind verschieden).

orders: Paare [customer_id, amount].

Ausgabe

Gib "<name>:<total>" für jeden Kunden mit Bestellungen zurück, sortiert nach Summe absteigend und bei gleicher Summe nach Name (ordinale Reihenfolge).

Einschränkungen

1 ≤ Anzahl der Kunden ≤ 10,000

0 ≤ Anzahl der Bestellungen ≤ 100,000; 1 ≤ amount ≤ 10^6

Beispiele

Beispiel 1
Eingabe:
orders = [
    [1, 50],
    [2, 30],
    [1, 20]
]
customer_ids = [1, 2, 3]
customer_names = ["Ada", "Lin", "Bo"]

Erwartete Ausgabe:
expected = ["Ada:70", "Lin:30"]
Eingabe:
std::vector<std::vector<long long>> orders = {
    {1, 50},
    {2, 30},
    {1, 20}
};
std::vector<long long> customer_ids = {1, 2, 3};
std::vector<std::string> customer_names = {"Ada", "Lin", "Bo"};

Erwartete Ausgabe:
std::vector<std::string> expected = {"Ada:70", "Lin:30"};
Eingabe:
long[][] orders = new long[][] {
    new long[] {1, 50},
    new long[] {2, 30},
    new long[] {1, 20}
};
long[] customer_ids = new long[] {1, 2, 3};
string[] customer_names = new string[] {"Ada", "Lin", "Bo"};

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

Erläuterung

Ada hat zwei Bestellungen (50 + 20 = 70) und Lin eine (30); Bo hat keine und fällt weg: ["Ada:70", "Lin:30"].

Beispiel 2
Eingabe:
orders = [
    [8, 40],
    [7, 40],
    [9, 99]
]
customer_ids = [7, 8]
customer_names = ["Zoe", "Max"]

Erwartete Ausgabe:
expected = ["Max:40", "Zoe:40"]
Eingabe:
std::vector<std::vector<long long>> orders = {
    {8, 40},
    {7, 40},
    {9, 99}
};
std::vector<long long> customer_ids = {7, 8};
std::vector<std::string> customer_names = {"Zoe", "Max"};

Erwartete Ausgabe:
std::vector<std::string> expected = {"Max:40", "Zoe:40"};
Eingabe:
long[][] orders = new long[][] {
    new long[] {8, 40},
    new long[] {7, 40},
    new long[] {9, 99}
};
long[] customer_ids = new long[] {7, 8};
string[] customer_names = new string[] {"Zoe", "Max"};

Erwartete Ausgabe:
string[] expected = new string[] {"Max:40", "Zoe:40"};

Erläuterung

Beide haben 40 und werden nach Name sortiert; die Bestellung für die unbekannte ID 9 wird ignoriert: ["Max:40", "Zoe:40"].

So gehst du vor

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

Hinweis 1

Summiere zuerst die Bestellbeträge pro Kunden-ID.

Hinweis 2

Gehe dann die Kunden durch und behalte die, die eine Summe haben.

Hinweis 3

Sortiere nach Summe absteigend, dann nach Name in ordinaler Reihenfolge.

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.