循环队列--击鼓传花或者叫烫手的山芋(hot potato)

之前我们已经实现了一个Queue的构造函数。这里使用它来模拟一个击鼓传花的游戏。

function hotPotato(name_list, num) {
	var queue = new Queue();
	for(var i=0; i<name_list.length; ++i) {
		queue.enqueue(name_list[i]);
	}

	var eliminated = "";
	var round = 1;
	while(queue.size() > 1) {
		for(var i=0; i<num; ++i) {
			queue.enqueue(queue.dequeue());
		}

		elimated = queue.dequeue();
		console.log("Round " + (round++) + ":   " + elimated);
	}

	return queue.dequeue();
}

var name_list = ["Fiona", "Leon", "Jerry", "Susan", "Orianna", "Amumu"];

console.log("The winner is " + hotPotato(name_list,2));

输出结果: 


对于这个问题,使用队列的结构很清晰。同样的,我们仍然可以只用数组来模拟这个过程。

只需要进行一个取余运算就可以完成循环遍历队列的问题

function hotPotatoUseArray(name_list, num) {
	var current_index = 0;
	var eliminated = "";
	while(name_list.length > 1) {
		current_index = (current_index +num) % name_list.length;
		eliminated = name_list.splice(current_index, 1);
		console.log("eliminated: " + eliminated);
	}

	return name_list[0];
}

var name_list = ["Fiona", "Leon", "Jerry", "Susan", "Orianna", "Amumu"];

console.log("The winner is " + hotPotatoUseArray(name_list, 2));

输出结果与上面是一致的



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值