描述
有100个数,每隔两个删除一个,问最后保留的数是哪个?
思路分析
如果是用数组比较复杂,如果从纯粹循环的角度出发,需要进行若干次循环,而且判断比较麻烦。
如果是队列比较简单,只要从头部开始删除一个元素,指针+1,如果指针对3取余等于0,那么就代表是需要删除的元素,从头部删除;否则,放到元素尾部继续。这样可以直接省略掉数据搬移和重新计数的情况
循环中止的条件:队列只有一个元素。
这样思考比原先的数组多次嵌套循环要简单,但我们也不妨去对比下两者的代码,很显然如果要用数组循环删除元素,那么需要用到递归的思想。
备注:这里需要特备注意的是是否需要考虑上一次的循环计数的指针,比如第一次循环结束,但是是计数到第二个。
代码实现
为了方便实现初始化,我们在构造器函数中可以支持数组初始化。
function Joseph(arr){
if(!Array.isArray(arr)){
return
}
let myQueue = new Queue(arr);
let index = 1;
while(arr.length>1){
if(index%3 === 0){
myQueue.dequeue();
} else{
let data= myQueue.dequeue();
myQueue.enqueue(data);
}
index++;
}
return arr[0];
}