问题背景:我们先来了解一下什么是约瑟夫环问题: 讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后kill所有人。 于是约瑟夫建议:每次由其他两人一起kill一个人,而被kill的人的先后顺序是由抽签决定的,约瑟夫有预谋地抽到了最后一签,在kill了除了他和剩余那个人之外的最后一人,他劝服了另外一个没死的人投降了罗马。
这里我们以十个人为例子
<script>
let out=0//被kill的人数
let index=0//所循环的次数
let kill=0//所计数
let n=10
let arr = new Array(n)
for(let i=0;i<n;i++)
{
arr[i]=i+1
}
while(kill<n-1)
{
if(arr[index%arr.length]!=0)
count++
if(count==3)
{
out++
count=0
arr[index%arr.length]=0
}
index++
}
for (let i=0;i<arr.length;i++)
{
if(arr[i]!=0)
{
console.log("存活的是"+arr[i])
}
}
</script>
十个人的话,最后剩余的是4
另:
let n=10
let arr = new Array(n)
for(let i=0;i<n;i++)
{
arr[i]=i+1
}
let index=0
while(arr.length>1)
{
index = (index+2)%arr.length
console.log(`本次被kill的是${arr[index % arr.length]}`)
arr.splice(index,1)
}
用JavaScript特有的splice, splice会改变原数组结构,通过这个特性就可以找到此时的index到下一个index之间刚好是2