* feat(tools): add seed/solution restore script * chore(curriculum): remove empty sections' markers * chore(curriculum): add seed + solution to Chinese * chore: remove old formatter * fix: update getChallenges parse translated challenges separately, without reference to the source * chore(curriculum): add dashedName to English * chore(curriculum): add dashedName to Chinese * refactor: remove unused challenge property 'name' * fix: relax dashedName requirement * fix: stray tag Remove stray `pre` tag from challenge file. Signed-off-by: nhcarrigan <nhcarrigan@gmail.com> Co-authored-by: nhcarrigan <nhcarrigan@gmail.com>
4.9 KiB
id, title, challengeType, videoUrl, dashedName
id | title | challengeType | videoUrl | dashedName |
---|---|---|---|---|
587d8255367417b2b2512c74 | 创建优先级队列类 | 1 | create-a-priority-queue-class |
--description--
在此挑战中,您将创建一个优先级队列。优先级队列是一种特殊类型的队列,其中项目可能具有指定其优先级的附加信息。这可以简单地用整数表示。项目优先级将覆盖确定序列项目已出列的放置顺序。如果具有较高优先级的项目在具有较低优先级的项目之后排队,则较高优先级项目将在所有其他项目之前出列。例如,让我们假设我们有一个包含三个项目的优先级队列: [['kitten', 2], ['dog', 2], ['rabbit', 2]]
这里第二个值(整数)表示项目优先级。如果我们将优先级为1
['human', 1]
排入队列(假设优先级较低,则优先级较低),那么它将成为第一个出列的项目。该集合将是这样的: [['human', 1], ['kitten', 2], ['dog', 2], ['rabbit', 2]]
。我们已经开始在代码编辑器中编写PriorityQueue
。您需要添加一个enqueue
方法来添加具有优先级的项目,一个用于删除项目的dequeue
方法,一个用于返回队列中项目数量的size
方法,一个用于返回队列front
元素的front
方法,以及最后一个isEmpty
方法,如果队列为空则返回true
,否则返回false
。入enqueue
应接受上面显示格式的项目( ['human', 1]
),其中1
表示优先级。 dequeue
应该只返回当前项目,而不是其优先级。
--hints--
您的Queue
类应该有一个enqueue
方法。
assert(
(function () {
var test = new PriorityQueue();
return typeof test.enqueue === 'function';
})()
);
您的Queue
类应该有一个dequeue
方法。
assert(
(function () {
var test = new PriorityQueue();
return typeof test.dequeue === 'function';
})()
);
您的Queue
类应该有一个size
方法。
assert(
(function () {
var test = new PriorityQueue();
return typeof test.size === 'function';
})()
);
您的Queue
类应该有一个isEmpty
方法。
assert(
(function () {
var test = new PriorityQueue();
return typeof test.isEmpty === 'function';
})()
);
当项目入队和出列时,您的PriorityQueue应使用size
方法正确跟踪当前项目数。
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;
})()
);
当队列为空时, isEmpty
方法应该返回true
。
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();
})()
);
优先级队列应该在具有较低优先级的项之前返回具有较高优先级的项,否则以先进先出顺序返回项。
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
}