什么是約瑟夫環(huán)呢?
約瑟夫環(huán)(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規(guī)律重復下去,直到圓桌周圍的人全部出列。

image.png
例如:耶穌有13個門徒,其中有一個就是出賣耶穌的叛徒,請用排除法找出這位叛徒:13人圍坐一圈,從第一個開始報號:1,2,3,1,2,3…。凡是報到“3”就退出圈子,最后留在圈子內的人就是出賣耶穌的叛徒。
思路:
- 首先假設,當數字為1的時候則表示活著的人,0為死了,這樣我們就可以用數組來表示;
- 要考慮的幾個問題,要形成一個環(huán),就是說報數到第十三人的時候,從頭開始報數;
- 報數為3的時候,那個人退出游戲,這里假設死了,數值為0;
- 還有一個問題,就是當報數到第四個人的時候,因為第三個人‘死了’,所以第四個人要從1開始報數;
5.當最后只剩下一個人的時候,則結束。
<script>
var arr = [1,1,1,1,1,1,1,1,1,1,1,1,1];
var count = 0;
var num = 0;
for(var i=0;i<arr.length;i++){
// 判斷活著
if(arr[i]==1){
// 開始計數
count++;
// 當報數到第四個的時候,從第一個開始報數
if(count==4){
count = 1;
}
// 當報數報到第三個人的時候,第三個人就死了
if(count == 3){
arr[i]=0;
num++;
// 當計數到最后的時候,游戲結束
if(num == arr.length-1){
break;
}
}
}
// 當數到最后一個人的時候,從第一個人重頭數,如果i=0的時候,i++就變成了2,所以i要為0
if(i==arr.length-1){
i = -1;
}
}
console.log(arr);
</script>
結果:

1.png
過了兩年,學習了數據結構,用隊列解決這種問題再簡單不過,特此補上
// 思路: 定義一個隊列,隊列先進先出,故先進來的數字先出去,再定義個index用來記錄當前元素在隊列中的位置,位置是3的倍數,則刪除
function isPt(arr) {
let queue = [];
let index = 0;
for (let i = 0; i < arr.length; i++) {
queue.push(arr[i]);
}
while (queue.length !== 1) {
let item = queue.shift(); // 將環(huán)中數據一一刪除
index += 1;
if (index % 3 !== 0) { // 不是3的倍數,再從環(huán)尾加入
queue.push(item);
}
}
return queue[0];
}
// 測試
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
isPt(arr);