freeCodeCamp/curriculum/challenges/italian/10-coding-interview-prep/data-structures/create-a-priority-queue-cla...

6.3 KiB

id title challengeType forumTopicId dashedName
587d8255367417b2b2512c74 Creare una classe Coda di Priorità 1 301630 create-a-priority-queue-class

--description--

In questa sfida creerai una Coda di Priorità. Una Coda Priorità è un tipo speciale di Coda in cui gli oggetti possono avere informazioni aggiuntive che ne specificano la priorità. Questa potrebbe essere semplicemente rappresentata con un numero intero. La priorità degli elementi sovrascriverà l'ordine di posizionamento nel determinare la sequenza di elementi rimossi dalla coda. Se un elemento con una priorità più alta viene accodato dopo gli elementi con priorità più bassa, l'elemento con priorità più alta sarà rimosso dalla coda prima di tutti gli altri.

Per esempio, immaginiamo di avere una coda di priorità con tre elementi:

[['kitten', 2], ['dog', 2], ['rabbit', 2]]

Qui il secondo valore (un intero) rappresenta la priorità dell'elemento. Se accodi ['human', 1] con una priorità di 1 (ipotizzando che le priorità più basse abbiano la precedenza) esso sarebbe il primo elemento ad essere rimosso dalla coda. La collezione assomiglierà a questa:

[['human', 1], ['kitten', 2], ['dog', 2], ['rabbit', 2]]

Abbiamo iniziato a scrivere una PriorityQueue nell'editor di codice. Dovrai aggiungere un metodo enqueue per aggiungere elementi con una priorità, un metodo dequeue per rimuovere e restituire gli oggetti, un metodo size per restituire il numero di elementi nella coda, un metodo front per restituire l'elemento nella parte anteriore della coda, e infine un metodo isEmpty che restituirà true se la coda è vuota o false se non lo è.

Il metodo enqueue dovrebbe accettare gli elementi con il formato mostrato sopra (['human', 1]) dove 1 rappresenta la priorità. dequeue e front dovrebbe restituire solo il nome dell'elemento, non la sua priorità.

--hints--

La tua classe PriorityQueue dovrebbe avere un metodo enqueue.

assert(
  (function () {
    var test = new PriorityQueue();
    return typeof test.enqueue === 'function';
  })()
);

La tua classe PriorityQueue dovrebbe avere un metodo dequeue.

assert(
  (function () {
    var test = new PriorityQueue();
    return typeof test.dequeue === 'function';
  })()
);

La tua classe PriorityQueue dovrebbe avere un metodo size.

assert(
  (function () {
    var test = new PriorityQueue();
    return typeof test.size === 'function';
  })()
);

La tua classe PriorityQueue dovrebbe avere un metodo front.

assert(
  (function () {
    var test = new PriorityQueue();
    return typeof test.front === 'function';
  })()
);

La tua classe PriorityQueue dovrebbe avere un metodo isEmpty.

assert(
  (function () {
    var test = new PriorityQueue();
    return typeof test.isEmpty === 'function';
  })()
);

La tua classe PriorityQueue dovrebbe tenere correttamente traccia del numero attuale di elementi utilizzando il metodo size mentre gli elementi vengono accodati e rimossi.

assert(
  (function () {
    var test = new PriorityQueue();
    test.enqueue(['David Brown', 2]);
    test.enqueue(['Jon Snow', 1]);
    var size1 = test.size();
    test.dequeue();
    var size2 = test.size();
    test.enqueue(['A', 3]);
    test.enqueue(['B', 3]);
    test.enqueue(['C', 3]);
    return size1 === 2 && size2 === 1 && test.size() === 4;
  })()
);

Il metodo front dovrebbe restituire l'elemento corretto nella parte anteriore della coda mentre gli elementi vengono accodati e rimossi.

assert(
  (function () {
    var test = new PriorityQueue();
    test.enqueue(['David Brown', 2]);
    var front1 = test.front();
    test.enqueue(['Jon Snow', 1]);
    var front2 = test.front();
    test.dequeue();
    test.enqueue(['A', 3]);
    var front3 = test.front();
    test.enqueue(['B', 3]);
    test.enqueue(['C', 3]);
    test.dequeue();
    var front4 = test.front();
    return (
      front1 === 'David Brown' &&
      front2 === 'Jon Snow' &&
      front3 === 'David Brown' &&
      front4 === 'A'
    );
  })()
);

Il metodo isEmpty dovrebbe restituire true quando la coda è vuota.

assert(
  (function () {
    var test = new PriorityQueue();
    test.enqueue(['A', 1]);
    test.enqueue(['B', 1]);
    test.dequeue();
    var first = test.isEmpty();
    test.dequeue();
    return !first && test.isEmpty();
  })()
);

La coda di priorità dovrebbe restituire gli elementi con una priorità più alta prima degli elementi con una priorità più bassa e restituire gli elementi nell'ordine first-in-first-out altrimenti.

assert(
  (function () {
    var test = new PriorityQueue();
    test.enqueue(['A', 5]);
    test.enqueue(['B', 5]);
    test.enqueue(['C', 5]);
    test.enqueue(['D', 3]);
    test.enqueue(['E', 1]);
    test.enqueue(['F', 7]);
    var result = [];
    result.push(test.dequeue());
    result.push(test.dequeue());
    result.push(test.dequeue());
    result.push(test.dequeue());
    result.push(test.dequeue());
    result.push(test.dequeue());
    return result.join('') === 'EDABCF';
  })()
);

--seed--

--seed-contents--

function PriorityQueue () {
  this.collection = [];
  this.printCollection = function() {
    console.log(this.collection);
  };
  // Only change code below this line

  // Only change code above this line
}

--solutions--

function PriorityQueue() {
  this.collection = [];
  this.printCollection = function () {
    console.log(this.collection);
  };
  // Only change code below this line
  this.enqueue = function (newitem) {
    if (this.isEmpty()) {
      return this.collection.push(newitem);
    }

    this.collection = this.collection.reverse();
    var found_index = this.collection.findIndex(function (item) {
      return newitem[1] >= item[1];
    });
    if (found_index === -1) {
      this.collection.push(newitem);
    } else {
      this.collection.splice(found_index, 0, newitem);
    }
    this.collection = this.collection.reverse();
  };
  this.dequeue = function () {
    if (!this.isEmpty()) {
      return this.collection.shift()[0];
    } else {
      return "The queue is empty.";
    }
  };
  this.size = function () {
    return this.collection.length;
  };
  this.front = function () {
    return this.collection[0][0];
  };
  this.isEmpty = function () {
    return this.size() > 0 ? false : true;
  };
  // Only change code above this line
}