关于约瑟夫环的问题,可能不少人都比较清楚。面试
但我头一次据说是在一个面试的时候,当时彻底懵逼呀。算法
自己算法这块就是很薄弱的。结果可想而知,想了好久都没有想通。数组
如今抽空整理一下对应这个算法的理解。spa
题目我就不累述了。code
把本身的思想记下来blog
若是咱们把这个问题简单了看,就是在一个数组里经过下标删除元素。rem
那么你会说,明明是一个环型,不错,可是咱们要把这个问题抽象一下。get
经过不断的移动下标删除元素,其实就是和环形的去删除一个意思。class
1.首先,你要知道求余这个东西。List
示例:3%5=3 19%8=3
经过第二个19%8的例子就能够知道。
19=8*2+3
通俗的就是,在一个19人的队伍了,从1开始报数,到队尾以后从队首接着数。19个数会数到几呢?
第三遍报数到第三我的的时候结束了。
因此由这个例子反向推约瑟夫环的问题,就没有那么抽象了。
假定有10我的,分别是[ A B C D E F G H I J ]。每次踢出数到3的人,从第一个开始
你用这个算法就能获得每次踢出去的人的问题了。
第一个开始就是下标为0的,踢出数3的人就是间隔是3
那么你就能够这么玩。
(0+3-1)%10=2 踢出下标2的人
(2+3-1)%9=4 踢出当前剩余人力下标为4的人。
以此类推。
这个问题就能够解决了。
具体代码以下
public Yue(int number,int start,int distance){ List<String> list=new ArrayList<String>(); for(int i=0;i<number;i++){ list.add((char)('A'+i)+""); } System.out.print("约瑟夫环("+number+","+start+","+distance+"),"); System.out.println(list.toString()); int i=start; while(list.size()>1){ i=(i+distance-1)%list.size(); System.out.print("删除的元素:"+list.remove(i).toString()+","); System.out.println(list.toString()); } System.out.println("被赦免的罪犯是:"+list.get(0).toString()); } public static void main(String[] args) { new Yue(10,1,3); }