人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,执行下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方向跳过相同数量的人,直到只剩下一个人,并被释放。约瑟夫问题即,给定人数、起点、方向和要跳过的数字,选择初始圆圈中的位置以避免被处决。
是这个约瑟夫问题吧?
简单看下,最主要的问题有三个:
在一个环里循环。可能需要用到特殊的数据结构,或者用数字、List等做取模操作。
“执行”下一个人,也就是从“环”中移除一个元素。可能涉及到数组位置移位,或者链表指针操作。
记录下初始位置。每次移除一个元素之后,其它元素在环中的位置是会变的。要得出最初位置,得在一开始就记录下来。
使用LinkedList的话,要做“环”形循环,就需要根据长度去做取模;从中移除一个元素,LinkedList已经帮你做了,调用remove就好,不用多操心;记录下初始位置这个,有个取巧的办法,就是LinkedList里一开始就存初始位置(1/2/3/4/5这样的整数)。当LinkedList.size()==1的时候,剩下的那个数字就是初始位置了。不过使用整数的话,好像list的remove会有点小问题?