循環隊列--擊鼓傳花或者叫燙手的山芋(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));

輸出結果與上面是一致的



發佈了88 篇原創文章 · 獲贊 37 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章