约瑟夫环的Java实现
关于约瑟夫环的问题,可能很多人都比较清楚。
但我头一次听说是在一个面试的时候,当时完全懵逼呀。
本身算法这块就是很薄弱的。结果可想而知,想了很久都没有想通。
现在抽空整理一下对应这个算法的理解。
题目我就不累述了。
把自己的思想记下来
如果我们把这个问题简单了看,就是在一个数组里通过下标删除元素。
那么你会说,明明是一个环型,不错,但是我们要把这个问题抽象一下。
通过不断的移动下标删除元素,其实就是和环形的去删除一个意思。
1.首先,你要知道求余这个东西。
示例: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); }
浙公网安备 33010602011771号