描述

有100个数,每隔两个删除一个,问最后保留的数是哪个?

思路分析

如果是用数组比较复杂,如果从纯粹循环的角度出发,需要进行若干次循环,而且判断比较麻烦。

如果是队列比较简单,只要从头部开始删除一个元素,指针+1,如果指针对3取余等于0,那么就代表是需要删除的元素,从头部删除;否则,放到元素尾部继续。这样可以直接省略掉数据搬移和重新计数的情况

循环中止的条件:队列只有一个元素。

这样思考比原先的数组多次嵌套循环要简单,但我们也不妨去对比下两者的代码,很显然如果要用数组循环删除元素,那么需要用到递归的思想。

备注:这里需要特备注意的是是否需要考虑上一次的循环计数的指针,比如第一次循环结束,但是是计数到第二个。

代码实现

为了方便实现初始化,我们在构造器函数中可以支持数组初始化。

  1. function Joseph(arr){
  2. if(!Array.isArray(arr)){
  3. return
  4. }
  5. let myQueue = new Queue(arr);
  6. let index = 1;
  7. while(arr.length>1){
  8. if(index%3 === 0){
  9. myQueue.dequeue();
  10. } else{
  11. let data= myQueue.dequeue();
  12. myQueue.enqueue(data);
  13. }
  14. index++;
  15. }
  16. return arr[0];
  17. }