前端算法codewhy第一章:队列

目录

在这里插入图片描述

认识队列

在这里插入图片描述

生活中的队列

在这里插入图片描述

开发中队列的应用

在这里插入图片描述

队列类的创建

在这里插入图片描述

队列的常见操作

在这里插入图片描述

击鼓传花

在这里插入图片描述
在这里插入图片描述

import ArrayQueue from "./01_实现队列结构Queue";

function hotPotato(names: string[], num: number): number {
    
    
  if (names.length === 0) return -1;

  // 1.创建队列结构
  const queue = new ArrayQueue<string>();

  // 2.将所有的name入队操作
  for (const name of names) {
    
    
    queue.enqueue(name);
  }

  // 3.淘汰的规则
  while (queue.size() > 1) {
    
    
    // 1/2不淘汰
    for (let i = 1; i < num; i++) {
    
    
      const name = queue.dequeue();
      if (name) queue.enqueue(name);
    }
    // 3淘汰
    queue.dequeue();
  }

  // 4.取出最后一个人的索引  !类型断言,确保是有值的,不是undefined
  const leftName = queue.dequeue()!;
  const index = names.indexOf(leftName);

  return index;
}

const leftIndex = hotPotato(
  ["why", "james", "kobe", "curry", "abc", "cba", "nba", "mba"],
  4
);
console.log(leftIndex);

什么是约瑟夫环问题(历史)?

在这里插入图片描述
在这里插入图片描述

import ArrayQueue from "./01_实现队列结构Queue";

function lastRemaining(n: number, m: number) {
    
    
  // 1.创建队列
  const queue = new ArrayQueue<number>();

  // 2.将所有的数字加入到队列中
  for (let i = 0; i < n; i++) {
    
    
    queue.enqueue(i);
  }

  // 3.判断队列中是否还有数字
  while (queue.size() > 1) {
    
    
    for (let i = 1; i < m; i++) {
    
    
      // 下面代码执行逻辑是先出队,再入队 类型断言 告诉代码有返回值,不为undefined
      queue.enqueue(queue.dequeue()!);
    }
    queue.dequeue();
  }

  return queue.dequeue()!;
}

console.log(lastRemaining(5, 3)); // 3
console.log(lastRemaining(10, 17)); // 2

猜你喜欢

转载自blog.csdn.net/SOLar7SysteM/article/details/129995747