JS使用普通队列实现击鼓传花游戏

news/2024/7/19 16:39:15 标签: 队列, 数据结构, js, 算法, 前端

最近复习到了数据结构中的普通队列部分,来实现一个击鼓传花游戏的应用。

循环队列的一个例子就是击鼓传花(hot potato),在这个游戏中,孩子们围成一个圆圈,把花尽快地传递给旁边的人。某一时刻传话停止,这个时候花在谁手里,谁就退出圆圈、结束游戏。重复这个过程,直到只剩一个孩子(胜者)

首先我们需要实现队列这个数据结构

class Queue {
    constructor() {
        // count属性控制队列的大小
        this.count = 0;
        // 追踪第一个元素
        this.lowestCount = 0;
        // 首先我们需要一个用于存储队列中元素的数据结构,我们可以使用数组,就像Stack一样.
        // 但是,为了写出一个在获取元素时更高效的数据结构,我们将使用一个对象来存储我们的元素
        this.items = {};        
    }

    enqueue(element) {
        this.items[this.count] = element;
        this.count++;
    }

    dequeue() {
        if(this.isEmpty()) {
            return undefined;
        }
        const result = this.items[this.lowestCount];
        delete this.items[this.lowestCount];
        this.lowestCount++;
        return result;
    }
    isEmpty() {
        return this.count - this.lowestCount === 0;
    }
    peek() {
        if(this.isEmpty()) {
            return undefined;
        }
        return this.items[this.lowestCount];
    }
    size() {
        return this.count - this.lowestCount;
    }
    clear() {
        this.items = {};
        this.count = 0;
        this.lowestCount = 0;
    }
    toString() {
        if(this.isEmpty()) {
            return '';
        }
        let objString = `${this.items[this.lowestCount]}`;
        for(let i = this.lowestCount + 1; i < this.count; i++) {
            objString = `${objString},${this.items[i]}`;
        }
        return objString;
    }
}

然后说一下通过队列实现这个游戏的思路,先把所有人添加到队列中,然后循环遍历队列,从队列头部移除一项,再将其添加到队列末尾,模拟击鼓传花的过程,一旦达到给定的传递次数,拿着花的那个人就被淘汰。

function hotPotato(elementList,num) {
    const queue = new Queue();
    const elimitatedList = [];
    // 把名单的名字全都加入队列
    for(let i = 0; i < elementList.length; i++) {
        queue.enqueue(elementList[i]);
    }
    while(queue.size() > 1) {
        for(let i = 0; i < num; i++) {
            // 从队列开头移除一项,再将其添加到队列末尾,模拟击鼓传花
            // (如果你把花传给了旁边的人,你被淘汰的威胁就立即解除了)。
            // 一旦达到给定的传递次数,拿着花的那个人就被淘汰了
            queue.enqueue(queue.dequeue());
        }
        // 被淘汰,从队列中移除
        elimitatedList.push(queue.dequeue());
    }
    return {
        elimitatedList:elimitatedList,
        winner:queue.dequeue()
    };
}

const names = ['John','Jack','Camila','Ingrid','Carl'];
const result = hotPotato(names,7);
result.elimitatedList.forEach(item => {
    console.log(`${item}在击鼓传花游戏中被淘汰。`);
})

console.log(`胜利者:${result.winner}`);

在这里插入图片描述
通过测试用例可以看到结果是正确的。

有任何问题都可以加我联系方式沟通交流。

QQ:505417246
微信:18331092918
微信公众号:Code程序人生
个人博客:https://Creator12333.github.io(详细总结一些面试题,以及前端进阶的内容,CSDN写偏基础的内容)


http://www.niftyadmin.cn/n/1576425.html

相关文章

fastjson 过滤不需要序列化的属性

JSON JSON英文全称为JavaScriptObject Natation&#xff0c;采用key:value键值对的方式存贮数据&#xff0c;与xml格式相比&#xff0c;JSON是一种轻量级的数据交换格式&#xff1b;不要被JavaScript这个单词迷惑&#xff0c;实际上JSON只是一种数据格式&#xff0c;与具体语言…

一文带你复习CSS3关于动画的全部知识

作为前端三剑客之一的CSS&#xff0c;最受大家关注的就是CSS3的改变&#xff0c;本文带大家复习一下CSS3中关于2D&#xff08;平移、旋转&#xff0c;缩放、倾斜&#xff09;&#xff0c;3D旋转&#xff0c;样式过渡&#xff0c;动画规则等内容&#xff0c;来实现页面中常用的动…

MongoDB官方文档学习(1)

一、并发性MMAPv1MongoDB 3.0提供表级锁。在同一时刻允许多个客户端修改不同表的文档。MongoDB 2.2-2.6 只允许在同一个库并发读&#xff0c;但是同一个库不支持并发写操作。WiredTiger在同一个表中&#xff0c;WiredTiger支持并发写操作。在同一时刻&#xff0c;允许多个客户端…

JS经典面试题---如何判断数组类型的数据

这是一个非常非常经典的面试题&#xff0c;无论是大中小厂出现的频率都很高。 因为数组属于引用类型&#xff0c;所以常规的typeof方法并不能判断数组类型。下面我总结了关于判断数组类型的几种方法&#xff0c;应该是比较全面的。 instanceof instanceof用于检测构造函数的p…

Django:The value of 'list_display[3]' refers to 'account_admin', which is not a call

初学Django&#xff0c;Django 修改models.py 字段后执行makemigrations报错&#xff0c;报错信息&#xff1a;<class test2.admin.AccountAdmin>: (admin.E108) The value of list_display[3] refers to account_admin, which is not a callable, an attribute of Accou…

JS实现一键回到顶部的功能(兼容所有浏览器,超级详细)

我们在浏览网页的时候&#xff0c;大部分都有一个一键回到顶部的按钮&#xff0c;无论是pc端还是移动端&#xff0c;这个功能都很常见。我在一次面试的时候&#xff0c;也要求手写这个功能。 首先我们新建一个空页面&#xff0c;把body的高度设置为3000px。这样做的目的是让浏览…

日志文件分离配置

2019独角兽企业重金招聘Python工程师标准>>> 简介 在实际的应用中有很多需要分离日志的需求&#xff0c;比如为了方便监控错误日志就会把错误日志分开&#xff0c;有一些重要的接口需要单独做日志的也需要单独分开。logback和log4j2都能通过配置简单实现日志的分离。…

微信小程序如何封装自己的组件?

在现在前端领域&#xff0c;最常见的话语就是组件化、工程化的内容。所有的框架都在朝着这方面发展。作为前端生态中的新兴热人物小程序的出现&#xff0c;同样支持组件化开发。 在我们的日常开发中&#xff0c;可以封装一些常用的组件达到复用效果&#xff0c;可以大大提高我们…