题目解析
本题就是约瑟夫环的变种题。
约瑟夫环的解题有多种方式,比较容易理解和实现的可以使用双端队列。
即intput_array当成双端队列,从队头取出元素,判断此时计数是否为m:
- 若是,则将取出的元素加入output_arr,并将取出的元素的值赋值给m,然后len--,计数重置为1
- 若不是,则将取出的元素塞回intput_array的队尾,仅计数++
但是本题JS是基于数组实现的双端队列,因此每次头部元素出队,都意味着一次O(n)复杂度的数组元素前移一位操作,这是非常影响性能的。
对于Java,Python都有内置的双端队列结构,因此可以直接复用,对于C,可以自己实现双端队列结构。
因此JS语言我们可以选择循环链表来模拟约瑟夫环。
循环链表本身就实现了环形结构,其head.prev = tail,tail.next = head。
且循环链表删除节点的复杂度是O(1)。
唯一的遗憾是,JS没有原生的循环链表结构,我们需要自己实现。但是我们只需要实现最简单的循环链表即可,即只实现循环链表的尾部新增节点操作即可。而删除操作可以在实际业务中完成。
JavaScript算法源码
双端队列
/* JavaScript Node ACM模式 控制