今天看视频教程无意间看到了一个数3减1的问题,百度之发现叫约瑟夫环问题,于是写了程序,问题大致描述如下:
一群带有编号的孩子手拉手围成一个圈报数,开始的孩子数1,他右边数2,再右边数3,数到n的孩子out,接着从下一个孩子开始继续数1,数到n的孩子out,如此循环...问最后留下来的孩子是原来的多少号?
我这里用Java写了一个双向回环链表代表围成的圈,其中的Kid是一个链表节点,他有一个左同胞,一个右同胞,还有一个id。双向会还链表定义了添加节点方法add(),删去节点方法delete();队首孩子firstKid,队尾孩子LastKid,还有表的长度count。
class Kidcircle{ private int count; Kid firstKid; Kid LastKid; Kidcircle(int num){ count = 0; for(int i=0;i<num;i++){ add(); } } private void add(){ Kid k = new Kid(); k.id = count+1; if(count==0){ LastKid = k; firstKid = k; } else { k.left = LastKid; k.right = firstKid; LastKid.right = k; firstKid.left = k; LastKid = k; } count++; } public void delete(Kid k){ if(count<=1){ return; } else { count--; k.left.right = k.right; k.right.left = k.left; if(k == firstKid){ firstKid = k.right; }else if(k==LastKid){ LastKid = k.left; } } } public int getSize(){ return count; } }
Kid类如下:
class Kid{ Kid left; Kid right; int id; }
然后main方法中这么写的,我假设的是数到3淘汰一个孩子,然后一共500人:
public class count3quit { public static void main(String[] args){ Kidcircle Kc = new Kidcircle(500); Kid currentKid = Kc.firstKid; while(Kc.getSize()>1){ Kc.delete(currentKid.right.right); currentKid = currentKid.right.right; } System.out.println(Kc.firstKid.id); } }
最后结果:436。
有时间还是要多回顾数据结构中的东西。