Tutte le sfide
Facile 0 risolte 0% di accettazione

Unire clienti e ordini

Unisci i clienti ai loro ordini come un Join LINQ e riporta la spesa totale di ciascuno.

Cosa imparerai

  • Unire due collezioni tramite una chiave comune
  • Sommare valori per gruppo
  • Ordinare per valore e risolvere i pareggi per nome

Problema

Il Join di LINQ abbina elementi di due sequenze tramite una chiave comune, come un join di database. Qui i clienti vengono abbinati ai loro ordini tramite l'id cliente.

Il cliente i ha id customer_ids[i] e nome customer_names[i]. Ogni ordine è [customer_id, amount].

Unisci le due: per ogni cliente con almeno un ordine, somma gli importi dei suoi ordini. I clienti senza ordini restano fuori e gli ordini con id sconosciuto vengono ignorati.

Implementa join_customers_orders(customer_ids, customer_names, orders).

Input

customer_ids, customer_names: I clienti (gli id sono distinti).

orders: Coppie [customer_id, amount].

Output

Restituisci "<name>:<total>" per ogni cliente con ordini, ordinati per totale dal più alto al più basso e per nome (ordine ordinale) a parità di totale.

Vincoli

1 ≤ numero di clienti ≤ 10,000

0 ≤ numero di ordini ≤ 100,000; 1 ≤ amount ≤ 10^6

Esempi

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

Output atteso:
expected = ["Ada:70", "Lin:30"]
Input:
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"};

Output atteso:
std::vector<std::string> expected = {"Ada:70", "Lin:30"};
Input:
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"};

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

Spiegazione

Ada ha due ordini (50 + 20 = 70) e Lin uno (30); Bo non ne ha e resta fuori: ["Ada:70", "Lin:30"].

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

Output atteso:
expected = ["Max:40", "Zoe:40"]
Input:
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"};

Output atteso:
std::vector<std::string> expected = {"Max:40", "Zoe:40"};
Input:
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"};

Output atteso:
string[] expected = new string[] {"Max:40", "Zoe:40"};

Spiegazione

Entrambi totalizzano 40, quindi sono ordinati per nome; l'ordine dell'id sconosciuto 9 viene ignorato: ["Max:40", "Zoe:40"].

Come affrontarlo

Prova prima da solo, poi apri un suggerimento alla volta.

Suggerimento 1

Prima somma gli importi degli ordini per id cliente.

Suggerimento 2

Poi scorri i clienti e tieni quelli che hanno un totale.

Suggerimento 3

Ordina per totale decrescente, poi per nome in ordine ordinale.

Complessità attesa

tempo O(n log n), spazio aggiuntivo O(n)

Riferimenti

Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.