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