数据结构 | 使用队列和双端队列解决问题

Queue类和Deque类请参考:Queue 和 Deque

循环队列——击鼓传花游戏(队列)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function hotPotato(elementsList, num) {
const queue = new Queue();
const elimitatedList = [];

// 先把参与的elementsList加入到队列中
for (let i = 0; i < elementsList.length; i++) {
queue.enqueue(elementsList[i]);
}
// console.log(queue)

// 开始击鼓
while (queue.size() > 1) {
// console.log(queue.size())
for (let i = 0; i < num; i++) {
queue.enqueue(queue.dequeue()); // 把对头元素加入到队尾
}
elimitatedList.push(queue.dequeue()); // 一轮循环结束后,对头的被淘汰,循环继续
}

return {
eliminated: elimitatedList,
winner: queue.dequeue() // 最后剩下的人为胜利者
};
}

// test
const names = ['John', 'Jack', 'Jenny', 'Kate', 'Tom'];
const res = hotPotato(names, 7);

res.eliminated.forEach(ele => {
console.log(`${ele} 在击鼓传花游戏中被淘汰!`)
})

console.log(`胜利者是${res.winner}!`)

/*
Jenny 在击鼓传花游戏中被淘汰!
Jack 在击鼓传花游戏中被淘汰!
Tom 在击鼓传花游戏中被淘汰!
Kate 在击鼓传花游戏中被淘汰!
胜利者是John!
*/

/*
如果要实现随机,可以在不同轮次传入不同的num!
*/

回文检查器(双端队列)

一般回文检查我们使用双指针的方式,但是使用双端队列也是一种好办法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function palindromeChecker(aString) {
if (aString === undefined || aString === null || !aString.length) return false;

const deque = new Deque();
const lowerString = [...aString]; // 解构赋值:字符串转数组
let firstChar, lastChar;

// 把元素存入deque中
for (let i = 0; i < lowerString.length; i++) {
deque.addBack(lowerString[i]);
}

// 判断ing
while (deque.size() > 1) {
firstChar = deque.removeFront();
lastChar = deque.removeBack();

if (firstChar !== lastChar) {
return false;
} else {
continue;
};
};

return true;
}

// test
const aString1 = 'helloaolleh';
const aString2 = 'helloworldolleh';

console.log(palindromeChecker(aString1)); // true
console.log(palindromeChecker(aString2)); // false