声明队列
interface IQueue<T> {
enqueue(element: T): void
dequeue(): T | undefined
peek(): T | undefined
isEmpty(): boolean
size(): number
}
export default IQueue
使用数组实现
import IQueue from "./IQueue"
class ArrayQueue<T> implements IQueue<T>{
private data: T[] = []
enqueue(element: T): void {
this.data.push(element)
}
dequeue(): T | undefined {
return this.data.shift()
}
peek(): T | undefined {
return this.data[0]
}
isEmpty(): boolean {
return this.data.length === 0
}
size(): number {
return this.data.length
}
}
export default ArrayQueue
约瑟夫环
import ArrayQueue from "./01数组实现";
function lastRemaining(n: number, m: number) {
const queue = new ArrayQueue<number>()
for (let i = 0; i < n; i++) {
queue.enqueue(i)
}
while (queue.size() > 1) {
for (let i = 1; i < m; i++) {
queue.enqueue(queue.dequeue()!)
}
queue.dequeue()
}
return queue.dequeue()!
}
console.log(lastRemaining(5, 3))
console.log(lastRemaining(10, 17))