在看javaScript数据结构与算法这本书时,看到一个挺有意思的题目--击鼓传花

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

书上给出了循环队列的解决方案

function Queue() {var items = [];this.enqueue = function(element){items.push(element);};this.dequeue = function(){return items.shift();};this.front = function(){return items[0];};this.isEmpty = function(){return items.length == 0;};this.clear = function(){items = [];};this.size = function(){return items.length;};this.print = function(){console.log(items.toString());};
}
function hotPotato (nameList, num){var queue = new Queue(); // {1}for (var i=0; i<nameList.length; i++){queue.enqueue(nameList[i]); // {2}}var eliminated = '';while (queue.size() > 1){for (var i=0; i<num; i++){queue.enqueue(queue.dequeue()); // {3}}eliminated = queue.dequeue();// {4}console.log(eliminated + '在击鼓传花游戏中被淘汰。');}return queue.dequeue();// {5}
}
var names = ['John','Jack','Camila','Ingrid','Carl'];
var winner = hotPotato(names, 7);
console.log('胜利者:' + winner);

我想到的是链表,感觉更符合场景需求

/*** Created by ** on 2017/12/14.*/
function LinkedList() {var Node = function(element){ // {1}this.element = element;this.next = null;};var length = 0; // {2}var head = null; // {3}this.append = function(element){var node = new Node(element), //{1}current; //{2}if (head === null){ //列表中第一个节点 //{3}head = node;} else {current = head; //{4}//循环列表,直到找到最后一项while(current.next){current = current.next;}//找到最后一项,将其next赋为node,建立链接current.next = node; //{5}}length++; //更新列表的长度 //{6}};this.insert = function(position, element){//检查越界值if (position >= 0 && position <= length){ //{1}var node = new Node(element),current = head,previous,index = 0;if (position === 0){ //在第一个位置添加node.next = current; //{2}head = node;} else {while (index++ < position){ //{3}previous = current;current = current.next;}node.next = current; //{4}previous.next = node; //{5}}length++; //更新列表的长度return true;} else {return false; //{6}}};this.removeAt = function(position){//检查越界值if (position > -1 && position < length){ // {1}var current = head, // {2}previous, // {3}index = 0; // {4}//移除第一项if (position === 0){ // {5}head = current.next;} else {while (index++ < position){ // {6}previous = current; // {7}current = current.next; // {8}}//将previous与current的下一项链接起来:跳过current,从而移除它previous.next = current.next; // {9}}length--; // {10}return current.element;} else {return null; // {11}}};this.remove = function(element){var index = this.indexOf(element);return this.removeAt(index);};this.indexOf = function(element){var current = head, //{1}index = -1;while (current) { //{2}if (element === current.element) {return index; //{3}}index++; //{4}current = current.next; //{5}}return -1;};this.isEmpty = function() {return length === 0;};this.size = function() {return length;};this.toString = function(){var current = head, //{1}string = ''; //{2}while (current) { //{3}string = current.element; //{4}current = current.next; //{5}}return string; //{6}};// this.print = function(){};this.getHead = function(){return head;};this.setHead = function(element){head = element;};/*** 创建循环链表*/this.creatTail = function(){var current = head; //{4}//循环列表,直到找到最后一项while(current.next){current = current.next;}//找到最后一项,将其next赋为head,建立循环链接current.next = head; //{5}}/*** 循环链表删除方法* @param position* @returns {null}*/this.removeAt_tail = function(position){//检查越界值if (position > -1 && length > 1){ // {1}var current = head, // {2}previous, // {3}index = 0; // {4}//如果移除数大于链表长度,会循环找数,直接取取余if(position > length){position = position%length;}//移除第一项if (position === 0){ // {5}head = current.next;} else {while (index++ < position){ // {6}previous = current; // {7}current = current.next; // {8}}//将previous与current的下一项链接起来,取消引用current,从而移除它previous.next = current.next; // {9}this.setHead(previous.next);//重新设置head}length--; // {10}return current.element;} else {return null; // {11}}};
}function hotPotato (nameList, num){var list = new LinkedList();for (var i=0; i<nameList.length; i++){list.append(nameList[i]);}list.creatTail();var eliminated = '';while (list.size() > 1){eliminated = list.removeAt_tail(num);console.log(eliminated + '在击鼓传花游戏中被淘汰。');}return list.getHead();// {5}
}var names = [];
for(var i = 0;i<100;i++){names.push(i);
}var winner = hotPotato(names, 7);
console.log('胜利者:' + winner.element);

转载于:https://my.oschina.net/u/3434840/blog/1589859

分享一个有意思题目--击鼓传花相关推荐

  1. 三、队列:优先队列+循环队列(击鼓传花算法)

    队列: 队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项.队列在尾部添加新元素,并从顶部移除元素.最新添加的元素必须排在队列的末尾. 在现实中, ...

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

    最近复习到了数据结构中的普通队列部分,来实现一个击鼓传花游戏的应用. 循环队列的一个例子就是击鼓传花(hot potato),在这个游戏中,孩子们围成一个圆圈,把花尽快地传递给旁边的人.某一时刻传话停 ...

  3. 利用JS实现循环队列--击鼓传花游戏

    由于队列经常被应用在计算机领域和我们的现实生活中,就出现了一些队列的修改版,其中一种叫做循环队列. 循环队列的一个例子就是击鼓传花游戏. 在这个游戏中,孩子们围成一个圆圈,把花尽快的传递给旁边的人.某 ...

  4. 用js写出数据结构中的自定义队列,利用队列思想写出一个击鼓传花的游戏函数,优先级队列

    队列的核心是先进先出 1.用js写出数据结构中的自定义队列 class Queue{constructor(){this.item = [];}// 1.入队enqueue(ele){this.ite ...

  5. 击鼓传花c语言编程题,c语言-第5章 循环程序设计.ppt

    <c语言-第5章 循环程序设计.ppt>由会员分享,可在线阅读,更多相关<c语言-第5章 循环程序设计.ppt(83页珍藏版)>请在人人文库网上搜索. 1.第5章 循环程序设计 ...

  6. 被邀的击鼓传花游戏, 我点名了哈!

    1)点你的人是: 珊 2)你们的关系是:有缘与我名字同音而认识,能干.聪明.可爱的小女孩 3)你觉得周围的人认为你是个怎样的人: 进取.认真.勤劳.踏实,很有人缘的人. 4)自己喜欢的个性是: 活泼. ...

  7. 笔试题13——击鼓传花

    题目描述 学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏.游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击 ...

  8. 数据结构之 击鼓传花

    2015/10/16/ ///by XBW// //环境  vs2013// 这是我们的数据结构的一个作业题,一个小作业之所以上博客,是希望在此mark一下,祭奠我失去的两天时光,以此警醒我要读明白题 ...

  9. 58同城19机试题—击鼓传花

    #题目描述 击鼓传花游戏:总共m个人围城一圈,编号从1开始.从第一个人开始传递一朵花,当传到第n次时,持花者出局,下一个人重新计数传递,重复直到所有人都出局.请给出按照原始编号的出剧顺序.例:有7个人 ...

最新文章

  1. 利用 Swoole 给应用写个防火墙
  2. 数字图像处理与Python实现笔记之图像特征提取
  3. [BZOJ5303] [HAOI2018] 反色游戏
  4. 【caffe-Windows】mnist实例编译之model的生成
  5. 高效的企业测试-结论(6/6)
  6. Java文件类String [] list(FilenameFilter fnf)方法,带示例
  7. javascript实现窗口随着鼠标移动且移动路径重现
  8. CSS 框模型( Box module )
  9. listview 通用模版
  10. Java 中的参数传递和引用类型
  11. 清华大学python视频_涨见识了,清华大学全套Python579集视频教程泄露,拿走学去吧...
  12. 牛客网暑期ACM多校训练营(第五场): F. take(期望+线段树)
  13. 以下属于4nf的分解为_数据库原理·模拟试卷及答案(1)
  14. JNCIE考试准备指南(ITAA 2014版)
  15. 从校园到职场,别让父母限制了你的天花板
  16. Python3网络爬虫:腾讯新闻App的广告数据抓取
  17. iOS小工具合集-(合一Kit)
  18. 5 MATLAB参数估计与假设检验-参数估计
  19. 考研复试专业课面试——C++
  20. 【毕业设计】基于单片机的智能衣柜系统设计 - 物联网 stm32 嵌入式

热门文章

  1. 从零开始的微信小程序入门教程(一)
  2. Hadoop基础操作--查询集群的计算资源信息
  3. 2018年5月出海记录(HYPACK、SES2000、Klein3000)
  4. 《Linuxnbsp;Kernelnbsp;Development》读书…
  5. 360网站卫士的IP段添加进服务器的白名单中
  6. NLP面试宝典:38个最常见NLP问题答案一文get
  7. 在种子轮中,如何区分风险投资、种子投资和天使投资?
  8. 运放放大倍数计算公式_运算放大器的虚短、虚断,你都会了吗
  9. bzoj1146整体二分+树链剖分+树状数组
  10. Android 语音输入API使用