Tutte le sfide
Media 0 risolte 0% di accettazione

Ordine di rilascio RAII

Determina l'ordine in cui le risorse con scope vengono rilasciate quando i loro scope terminano, come garantisce RAII.

Cosa imparerai

  • Rilasciare risorse alla fine di uno scope
  • Distruggere oggetti in ordine inverso alla creazione
  • Modellare scope annidati con uno stack

Problema

In C++, RAII lega una risorsa alla durata di un oggetto: la risorsa viene rilasciata automaticamente quando l'oggetto esce dallo scope. Gli oggetti nello stesso scope vengono distrutti in ordine inverso rispetto a quello di creazione.

Elabora gli eventi nell'ordine:

  • {: entra in un nuovo scope interno.
  • }: lascia lo scope corrente; ogni risorsa acquisita al suo interno viene rilasciata, prima la più recente.
  • acquire <name>: crea una risorsa nello scope corrente.

Quando gli eventi finiscono, gli scope aperti rimanenti terminano dal più interno al più esterno (incluso lo scope esterno del programma), rilasciando le loro risorse nello stesso modo.

Implementa raii_release_order(events).

Input

events: Gli eventi. Le parentesi graffe sono bilanciate oppure lasciate aperte, e non vengono mai chiuse senza essere state aperte.

Output

Restituisci i nomi delle risorse nell'ordine in cui vengono rilasciate.

Vincoli

0 ≤ numero di eventi ≤ 100,000

I nomi hanno da 1 a 20 caratteri senza spazi

Esempi

Esempio 1
Input:
events = ["acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"]

Output atteso:
expected = ["lock", "file", "log", "db"]
Input:
std::vector<std::string> events = {"acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"};

Output atteso:
std::vector<std::string> expected = {"lock", "file", "log", "db"};
Input:
string[] events = new string[] {"acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"};

Output atteso:
string[] expected = new string[] {"lock", "file", "log", "db"};

Spiegazione

Uscire dallo scope interno rilascia lock poi file (prima il più recente). Alla fine lo scope esterno rilascia log poi db: ["lock", "file", "log", "db"].

Esempio 2
Input:
events = ["{", "acquire a", "{", "acquire b"]

Output atteso:
expected = ["b", "a"]
Input:
std::vector<std::string> events = {"{", "acquire a", "{", "acquire b"};

Output atteso:
std::vector<std::string> expected = {"b", "a"};
Input:
string[] events = new string[] {"{", "acquire a", "{", "acquire b"};

Output atteso:
string[] expected = new string[] {"b", "a"};

Spiegazione

Due scope sono ancora aperti alla fine: quello più interno rilascia b, poi quello successivo rilascia a: ["b", "a"].

Come affrontarlo

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

Suggerimento 1

Tieni uno stack di scope, ognuno con le sue risorse in ordine.

Suggerimento 2

Chiudere uno scope rilascia le sue risorse dalla più recente alla più vecchia.

Suggerimento 3

Alla fine chiudi tutti gli scope ancora aperti, partendo dal più interno.

Complessità attesa

tempo O(numero di eventi), spazio aggiuntivo O(numero di eventi)

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.