黑马程序员技术交流社区

标题: 从猴子选大王到约瑟夫环的经典问题 [打印本页]

作者: Rain2692    时间: 2014-12-15 19:50
标题: 从猴子选大王到约瑟夫环的经典问题
本帖最后由 Rain2692 于 2014-12-15 19:59 编辑

有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?(此代码十分精简,而且涵盖可以解决很多问题,精心整理)
  1. <p>
  2. </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
我就在这用链表来做了
  1. public static String getRing2(int total,int m,boolean isAll){
  2.         LinkedList<Integer> container=new LinkedList<Integer>();
  3.     for(int i=1;i<=total;i++)
  4.         container.add(i);
  5.     //初始化集合完成。
  6.     int count=1;//count用于数数,从1数到m。
  7.     StringBuilder result=new StringBuilder();
  8.     String temp="";
  9.     while(container.size()!=1){//一直数数,剔除目标元素,直到容器内只剩一个元素
  10.         for(int num=0;num<container.size();num++){//num用于遍历容器内的每一个元素
  11.         /*数到m,则剔除容器的内的当前元素
  12.         由于link集合剔除一个元素,意味着后面所有元素的角标-1,所以让num在剔除后自减
  13.         将count置0,下次循环继续从1开始数数。*/
  14.             if(count==m){
  15.                 temp=container.remove(num--)+",";
  16.                 if(isAll)
  17.                     result.append(temp);
  18.                 count=0;
  19.             }
  20.             count++;
  21.         }
  22.     }
  23.     result.append(container.remove());
  24.     return result.toString();
  25. }


  26.     public static String getRing3(int totalNum ,int m,boolean isAll){
  27.         class Node{
  28.             public int number;// 编号
  29.             public Node next;// 下一个节点
  30.             public Node(int number){
  31.                 this.number = number;
  32.             }
  33.         }
  34.                 Node header = new Node(1);
  35.         Node pointer = header;
  36.         for (int i = 2; i <= totalNum; i++) {
  37.             pointer.next = new Node(i);
  38.             pointer = pointer.next;
  39.         }
  40.         pointer.next = header;
  41.         // 初始化环形链表结束
  42.         StringBuilder result=new StringBuilder();
  43.         while (pointer != pointer.next) {
  44.             for (int i = 1; i < m; i++)
  45.                 pointer = pointer.next;
  46.             if(isAll)
  47.                 result.append(pointer.next.number+",");
  48.             pointer.next = pointer.next.next;
  49.         }
  50.         result.append(pointer.next.number);
  51.         return result.toString();
  52.     }
复制代码

作者: 南柯一梦境    时间: 2014-12-16 12:03
哇,你们好厉害啊,看来偶要多学多练了啊
作者: Eagle    时间: 2014-12-16 12:28
约瑟夫。。咳咳,,这就是差距啊、、、




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2