分享一个有意思题目--击鼓传花
在看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
分享一个有意思题目--击鼓传花相关推荐
- 三、队列:优先队列+循环队列(击鼓传花算法)
队列: 队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项.队列在尾部添加新元素,并从顶部移除元素.最新添加的元素必须排在队列的末尾. 在现实中, ...
- JS使用普通队列实现击鼓传花游戏
最近复习到了数据结构中的普通队列部分,来实现一个击鼓传花游戏的应用. 循环队列的一个例子就是击鼓传花(hot potato),在这个游戏中,孩子们围成一个圆圈,把花尽快地传递给旁边的人.某一时刻传话停 ...
- 利用JS实现循环队列--击鼓传花游戏
由于队列经常被应用在计算机领域和我们的现实生活中,就出现了一些队列的修改版,其中一种叫做循环队列. 循环队列的一个例子就是击鼓传花游戏. 在这个游戏中,孩子们围成一个圆圈,把花尽快的传递给旁边的人.某 ...
- 用js写出数据结构中的自定义队列,利用队列思想写出一个击鼓传花的游戏函数,优先级队列
队列的核心是先进先出 1.用js写出数据结构中的自定义队列 class Queue{constructor(){this.item = [];}// 1.入队enqueue(ele){this.ite ...
- 击鼓传花c语言编程题,c语言-第5章 循环程序设计.ppt
<c语言-第5章 循环程序设计.ppt>由会员分享,可在线阅读,更多相关<c语言-第5章 循环程序设计.ppt(83页珍藏版)>请在人人文库网上搜索. 1.第5章 循环程序设计 ...
- 被邀的击鼓传花游戏, 我点名了哈!
1)点你的人是: 珊 2)你们的关系是:有缘与我名字同音而认识,能干.聪明.可爱的小女孩 3)你觉得周围的人认为你是个怎样的人: 进取.认真.勤劳.踏实,很有人缘的人. 4)自己喜欢的个性是: 活泼. ...
- 笔试题13——击鼓传花
题目描述 学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏.游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击 ...
- 数据结构之 击鼓传花
2015/10/16/ ///by XBW// //环境 vs2013// 这是我们的数据结构的一个作业题,一个小作业之所以上博客,是希望在此mark一下,祭奠我失去的两天时光,以此警醒我要读明白题 ...
- 58同城19机试题—击鼓传花
#题目描述 击鼓传花游戏:总共m个人围城一圈,编号从1开始.从第一个人开始传递一朵花,当传到第n次时,持花者出局,下一个人重新计数传递,重复直到所有人都出局.请给出按照原始编号的出剧顺序.例:有7个人 ...
最新文章
- 利用 Swoole 给应用写个防火墙
- 数字图像处理与Python实现笔记之图像特征提取
- [BZOJ5303] [HAOI2018] 反色游戏
- 【caffe-Windows】mnist实例编译之model的生成
- 高效的企业测试-结论(6/6)
- Java文件类String [] list(FilenameFilter fnf)方法,带示例
- javascript实现窗口随着鼠标移动且移动路径重现
- CSS 框模型( Box module )
- listview 通用模版
- Java 中的参数传递和引用类型
- 清华大学python视频_涨见识了,清华大学全套Python579集视频教程泄露,拿走学去吧...
- 牛客网暑期ACM多校训练营(第五场): F. take(期望+线段树)
- 以下属于4nf的分解为_数据库原理·模拟试卷及答案(1)
- JNCIE考试准备指南(ITAA 2014版)
- 从校园到职场,别让父母限制了你的天花板
- Python3网络爬虫:腾讯新闻App的广告数据抓取
- iOS小工具合集-(合一Kit)
- 5 MATLAB参数估计与假设检验-参数估计
- 考研复试专业课面试——C++
- 【毕业设计】基于单片机的智能衣柜系统设计 - 物联网 stm32 嵌入式
热门文章
- 从零开始的微信小程序入门教程(一)
- Hadoop基础操作--查询集群的计算资源信息
- 2018年5月出海记录(HYPACK、SES2000、Klein3000)
- 《Linuxnbsp;Kernelnbsp;Development》读书…
- 360网站卫士的IP段添加进服务器的白名单中
- NLP面试宝典:38个最常见NLP问题答案一文get
- 在种子轮中,如何区分风险投资、种子投资和天使投资?
- 运放放大倍数计算公式_运算放大器的虚短、虚断,你都会了吗
- bzoj1146整体二分+树链剖分+树状数组
- Android 语音输入API使用