描述
有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];}
