这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战算法
即由插入元素的优先级来决定它的位置,而不是按照元素进出的顺序排列的。所以元素在插入的时候,还有一个优先级数决定这个元素应该被插到哪里。应用:就好比咱们生活中有时候会说女士优先、男士优先等,这些都是优先级的体现。数组
插入元素步骤:markdown
封装元素和优先级放在一块儿(封装一个新的构造函数)数据结构
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}s
复制代码
添加元素的时候,将新插入元素的优先级和队列中已经存在的元素优先级进行比较,获取这个元素的位置。函数
当这个队列中没有元素,或者插入的元素的优先级都比队列中的元素靠后的,直接push到队列中便可。post
splice
是一种数组方法。splice(t,v,s)
的t: 被删除元素的起始位置
;v: 被删除元素个数
; s: 被插入的新元素
this
splice(i, 0, queueElement)
表示把queueElement
插入到第i个元素后一位。0表示被删除元素个数为0.spa
PriorityQueue.prototype.enqueue = function (element, priority) {
var queueElement = new QueueElement(element, priority);
if (this.items.length == 0) {
this.items.push(queueElement);
} else {
var added = false;
for (let i = 0; i < this.items.length; i++) {
if (queueElement.priority < this.items[i].priority) {
this.items.splice(i, 0, queueElement);
added = true;
}
}
if (!added) {
this.items.push(queueElement);
}
}
}
复制代码
击鼓传花prototype
题目:n我的,从第一我的开始,数到m时这我的就被淘汰,接着下一我的从1开始数起。直到最后剩的那一我的获胜。code
这个题目用队列的方式能够很容易的作出来。以前在洛谷刷到过这道题,那时候还没学到数据结构,如今看却是容易许多。首先把n我的放到一个队列中,当尚未数到m时,队头元素变成队尾元素,当数到m时,队头元素被淘汰(删除),这样子循环下去,最后获得的结果就是那个获胜的元素。
function Queue() {
this.items = [];
// 将元素加入到队列中
Queue.prototype.enqueue = function (e) {
this.items.push(e);
}
// 删除第一个元素
Queue.prototype.dequeue = function () {
return this.items.shift();
}
}
function passGame(name, num) {
let queue = new Queue();
for (let i = 0; i < name.length; i++) {
queue.enqueue(name[i]);
}
while (queue.items.length > 1) {
for (let i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue(name[i]));
}
queue.dequeue(name[0]);
}
let endName = queue.items[0];
console.log(endName);
}
let nameList = ['Lily', 'Mannqo', 'Ytao', 'mama']
passGame(nameList, 6);
复制代码
整数反转
这道题我是用了数组的方式(栈的思想),由于栈的元素是先进后出的,我这里把所给的数字转换为字符串以后一个一个压入栈中,而后再把它一个一个取出来,再转换为数字。好比把1,2,3
分别压入栈中,此时的栈顶就是3,顺序出栈的结果就是3,2,1
;最后再根据题目要求返回对应值。
var reverse = function (x) {
let arr = [];
let str = x + '';
let str2 = '';
for (let i = 0; i < str.length; i++) {
arr.push(str[i]);
}
for (let i = 0; i < str.length; i++) {
str2 += arr.pop();
}
let num = parseInt(str2);
if (num < -Math.pow(2, 31) || num > Math.pow(2, 31) - 1) {
return 0
} else if (str[0] == '-') {
return -num;
} else {
return num;
}
};
复制代码
望大佬们多多指教orz,孩子会好好学的好好学的...