黑马程序员技术交流社区

标题: 使用for循环和迭代器两种方法解决约瑟夫环问题 [打印本页]

作者: 怪人长    时间: 2016-3-20 22:44
标题: 使用for循环和迭代器两种方法解决约瑟夫环问题
本帖最后由 怪人长 于 2016-3-20 22:45 编辑
  1. public class Demo02 {

  2.         /**
  3.          * 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,
  4.          * 从1报数,到14退出。问:最后剩下的是100人中的第几个人?
  5.          */
  6.         public static void main(String[] args) {
  7.                 int n = 100;
  8.                 method1(n);
  9.                 method2(n);
  10.         }

  11.         public static void method1(int n) {
  12.                 ArrayList<Integer> arr = new ArrayList<Integer>();
  13.                 for (int i = 1; i <= n; i++) {
  14.                         arr.add(i);
  15.                 }
  16.                
  17.                 int count = 0;
  18.                 int num = 0;
  19.                 int k = 0;
  20.                 int p = 0;
  21.                 while(arr.size()>1) {
  22.                         for (int j = 0; j < arr.size(); j++) {
  23. //                        for (ListIterator<Integer> li = arr.listIterator(); li.hasNext();) {
  24. //                                Integer j = li.next();//如果使用该条件作为for循环的条件,也无下述隐患
  25.                                 count++;
  26.                                 if (count == 14) {
  27.                                         k++;
  28.                                         System.out.println("第" + k +"次" + arr.get(j) + "退出");
  29.                                         arr.remove(j);//该方法有隐患,就是该句不能再上句前,否则会出现索引越界异常;
  30.                                         count = 0;
  31.                                         j--;          //注意:在删除元素之后,后面的元素角标都会变化,所以需要索引位移;
  32.                                 }
  33.                         }
  34.                 }
  35.                
  36.                 if (arr.size() == 1) {
  37.                         num = arr.get(0);
  38.                         System.out.println("剩下的是" + num);
  39.                 }
  40.         }
  41.         
  42.         
  43.         public static void method2(int n) {
  44.                 ArrayList<Integer> arr = new ArrayList<Integer>();
  45.                 for (int i = 1; i <= n; i++) {
  46.                         arr.add(i);
  47.                 }
  48.                
  49.                 int count = 0;
  50.                 int num = 0;
  51.                 int k = 0;
  52.                 while(arr.size()>1) {
  53.                         ListIterator<Integer> li = arr.listIterator();
  54.                         while(li.hasNext()) {
  55.                                 Integer j = li.next();
  56.                                 count++;
  57.                                 if (count == 14) {
  58.                                         k++;
  59.                                         System.out.println("第" + k +"次" + j + "退出");
  60.                                         li.remove();
  61.                                         count = 0;
  62.                                 }
  63.                         }
  64.                 }
  65.                
  66.                 if (arr.size() == 1) {
  67.                         num = arr.get(0);
  68.                         System.out.println("剩下的是" + num);
  69.                 }
  70.         }
  71. }
复制代码



作者: yuzy521    时间: 2016-3-22 17:39
学习了  迭代的不错
作者: lgdbest    时间: 2016-3-22 18:24
思路写清晰点  不是很明白




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