黑马程序员技术交流社区

标题: ArrayList解100人报数,答案是92吗?请大家帮看下。 [打印本页]

作者: JerryJava    时间: 2014-9-19 14:32
标题: ArrayList解100人报数,答案是92吗?请大家帮看下。
ArrayList解100人报数,答案是92吗?请大家帮看下。
============
我的代码。
  1. package CollectionFrame;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;

  4. //100个人报数,用ArrayList尝试实现
  5. public class JerryTest {

  6.         public static void main(String[] args) {
  7.                 JerryList jl = new JerryList();
  8.                 ArrayList<Integer> result = jl.baoshu();
  9.                 System.out.println("最后一个数是: " +result);
  10.         }
  11. }
  12. class JerryList
  13. {
  14.         public ArrayList<Integer> al = new ArrayList<Integer>();  //有点偷懒就写成public了
  15.         public JerryList()  //构造函数初始化一个size为100 , 从1到100的AL
  16.         {
  17.                 createAL();
  18.         }
  19.         private void createAL()
  20.         {
  21.                 for(int i=1 ;i<=100;i++ )
  22.                 {
  23.                         al.add(i);
  24.                 }       
  25.         }
  26.         public ArrayList<Integer> baoshu() // 主要的实现在baoshu()方法中
  27.         {
  28.                 int count = 0;                                //计数器
  29.                 System.out.println("原List长度:"+al.size()); //打印下初始的长度
  30.                         for(Iterator<Integer> it = al.iterator();al.size()!=1 ;)
  31.                                 /*最核心的思路:
  32.                                 1.报数其实就是迭代器,每到14就将元素remove ,这时候size会减1,直到只剩一个
  33.                                 元素时循环结束,所以是al.size()!=1
  34.                                 2.通过读题,我们知道人是围成圈的,也就是说最后一个元素结束后,指针应该回到整个集合开始的位置
  35.                                 尝试性的重置了迭代器,没想到还真行~~ it= al.iterator
  36.                                 3. 返回集合,此时集合中只有一个元素了,就是我们要的答案,我得出的是92 ,不确定是对的。*/
  37.                         {
  38.                                 Integer deleteNum = it.next();
  39.                                 //System.out.println(n);
  40.                                 count++;
  41.                                 if(count==14)
  42.                                 {
  43.                                         count=0;
  44.                                         it.remove();
  45.                                         System.out.println(deleteNum);
  46.                                 }
  47.                                
  48.                                 if(!it.hasNext())       //判断,如果已经到最后一个元素,那么就重置迭代器,形成了环形的集合。
  49.                                 {
  50.                                         it=al.iterator();
  51.                                 }
  52.                         }
  53.                         return al;
  54.         }
  55. }
复制代码
最核心的思路:
                                1.报数其实就是迭代器,每到14就将元素remove ,这时候集合size会减1,直到只剩一个
                                元素时循环结束,所以是al.size()!=1
                                2.通过读题,我们知道人是围成圈的,也就是说最后一个元素结束后,指针应该回到整个集合开始的位置
                                尝试性的重置了迭代器,没想到还真行~~ it= al.iterator  , 成功完成了一个环状的集合。
                                3. 返回集合,此时集合中只有一个元素了,就是我们要的答案,我得出的是92 ,不确定是对的。

请大家帮我分析下这样可以吗,有什么地方需要改或者优化的。谢谢了。

作者: JerryJava    时间: 2014-9-19 17:20
结果是对的~ 但是不知道过程是不是可以。
作者: 黎志勇    时间: 2014-9-19 18:27


我这样写的。
  1. import java.util.LinkedList;
  2. import java.util.List;

  3. public class Test4 {
  4.         public static void main(String[] args) {
  5.                 game(100, 14);
  6.         }

  7.         public static void game(int person, int num) {
  8.                 List<Integer> list = new LinkedList<Integer>();
  9.                 for (int i = 1; i <= person; i++) {
  10.                         list.add(i);
  11.                 }
  12.                 int pos = 0;
  13.                 while (list.size() > 1) {
  14.                         pos = (pos + num - 1) % list.size();
  15.                         list.remove(pos);

  16.                 }
  17.                 System.out.println(person + "人玩数" + num +
  18.                                 ",最后剩下的是第" + list.get(0) + "人");
  19.         }
  20. }
复制代码





作者: JerryJava    时间: 2014-9-19 19:49
黎志勇 发表于 2014-9-19 18:27
我这样写的。

能稍微解释下吗? 多谢
作者: fantacyleo    时间: 2014-9-19 21:35
有更简单的解法,不用任何复杂的数据结构:
  1. public int josephusRing(int n,int m) {
  2.        int k = 0;
  3.        for(int i = 1;i <= n; i++)
  4.             k = (k + m - 1) % i + 1;
  5.        return k;
  6. }
复制代码

作者: THE_FUTURE    时间: 2014-9-19 21:43
楼上的 简化了代码!
作者: JerryJava    时间: 2014-9-19 21:58
fantacyleo 发表于 2014-9-19 21:35
有更简单的解法,不用任何复杂的数据结构:

请教下具体的过程,不太明白~~
作者: fantacyleo    时间: 2014-9-19 22:05
JerryJava 发表于 2014-9-19 21:58
请教下具体的过程,不太明白~~

好,一会儿我干脆专门开个帖子说说这约瑟夫环的问题好了
作者: JerryJava    时间: 2014-9-20 07:11
fantacyleo 发表于 2014-9-19 22:05
好,一会儿我干脆专门开个帖子说说这约瑟夫环的问题好了

大神给力! 谢过!
作者: fantacyleo    时间: 2014-9-20 16:21
JerryJava 发表于 2014-9-20 07:11
大神给力! 谢过!

完工:http://bbs.itheima.com/thread-144249-1-1.html






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