黑马程序员技术交流社区
标题:
从猴子选大王到约瑟夫环的经典问题
[打印本页]
作者:
Rain2692
时间:
2014-12-15 19:50
标题:
从猴子选大王到约瑟夫环的经典问题
本帖最后由 Rain2692 于 2014-12-15 19:59 编辑
有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?(此代码十分精简,而且涵盖可以解决很多问题,精心整理)
<p>
</p>
复制代码
作者:
Rain2692
时间:
2014-12-15 20:02
先占一个。。。
作者:
史云龙
时间:
2014-12-15 20:38
我也占一个。。顺便学习学习。
作者:
as604049322
时间:
2014-12-15 21:07
本帖最后由 as604049322 于 2014-12-16 08:45 编辑
楼主的方法很不错
作者:
Honelyboy
时间:
2014-12-15 21:46
学习了,赞一个。
作者:
7788665544
时间:
2014-12-15 22:54
学习了!!!
作者:
zmhlnrs
时间:
2014-12-15 23:01
学习了 赞一个
作者:
as604049322
时间:
2014-12-16 11:35
我就在这用链表来做了
public static String getRing2(int total,int m,boolean isAll){
LinkedList<Integer> container=new LinkedList<Integer>();
for(int i=1;i<=total;i++)
container.add(i);
//初始化集合完成。
int count=1;//count用于数数,从1数到m。
StringBuilder result=new StringBuilder();
String temp="";
while(container.size()!=1){//一直数数,剔除目标元素,直到容器内只剩一个元素
for(int num=0;num<container.size();num++){//num用于遍历容器内的每一个元素
/*数到m,则剔除容器的内的当前元素
由于link集合剔除一个元素,意味着后面所有元素的角标-1,所以让num在剔除后自减
将count置0,下次循环继续从1开始数数。*/
if(count==m){
temp=container.remove(num--)+",";
if(isAll)
result.append(temp);
count=0;
}
count++;
}
}
result.append(container.remove());
return result.toString();
}
public static String getRing3(int totalNum ,int m,boolean isAll){
class Node{
public int number;// 编号
public Node next;// 下一个节点
public Node(int number){
this.number = number;
}
}
Node header = new Node(1);
Node pointer = header;
for (int i = 2; i <= totalNum; i++) {
pointer.next = new Node(i);
pointer = pointer.next;
}
pointer.next = header;
// 初始化环形链表结束
StringBuilder result=new StringBuilder();
while (pointer != pointer.next) {
for (int i = 1; i < m; i++)
pointer = pointer.next;
if(isAll)
result.append(pointer.next.number+",");
pointer.next = pointer.next.next;
}
result.append(pointer.next.number);
return result.toString();
}
复制代码
作者:
南柯一梦境
时间:
2014-12-16 12:03
哇,你们好厉害啊,看来偶要多学多练了啊
作者:
Eagle
时间:
2014-12-16 12:28
约瑟夫。。咳咳,,这就是差距啊、、、
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2