A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 周学彬 于 2013-10-24 16:26 编辑

做测试题时碰到了这题,觉得用数组太麻烦了。既然有集合这么强大的工具,有那么丰富的api可以用,为什么不用呢?于是灵机一动,就想到了使用ListIterator迭代器,边迭代,边删除。最后就实现了想要的功能。虽然效率不怎么高,但很容易理解却是真的,一点儿都不绕,就一个函数。如果觉得有问题的,欢迎提出来。
  1. package com.itheima;

  2. import java.util.*;
  3. /**
  4. * 第十题:有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
  5. *
  6. * 思路:
  7. *                 该题的实现方法比较多,比如用数组,Map集合,或双向链表方法等。这儿用的是我觉得最简单的方法,使用List集合特有的迭代器,ListIterator。该迭代器
  8. *                 在迭代时,还能能对集合进行删除添加等并发操作。如果把100个有编号的元素存到List集合中,边迭代便删除要退出的元素,那便很容易实现了
  9. * 方法实现步骤:
  10. *                 1,创建一个集合,该集合用于存放指定数目的,具有编号的元素。本题中即把1~100依次存放到集合中
  11. *                 2,定义一个迭代器,指向该集合。
  12. *                 3,开始迭代访问该集合。迭代到指定的次数,就删除该元素。如果迭代到了元素末尾,就重新指向该集合,即从头重新开始迭代
  13. *                 4,当迭代到最后只剩一个元素时,停止迭代,并返回该元素。
  14. * 注意:
  15. *                 在迭代的过程中,可以另外创建一个集合,用于存放被退出或删除的元素,这样就能看到程序的执行顺序了。
  16. * @author mrzhou
  17. *
  18. */

  19. public class Test10 {
  20.         public static void main(String[] args) {
  21.                 //初始化排队总人数和报告的数
  22.                 int TotalNumber = 100;
  23.                 int CountNumber = 14;
  24.                 //调用自定义的方法,得到最后一个元素
  25.                 int TheLastNumber = GetLastNumberFromQuene(TotalNumber, CountNumber);
  26.                 //打印该元素
  27.                 System.out.println("剩下的最后一个元素是:" + TheLastNumber);
  28.         }
  29.         
  30.         //定义该方法,使用ListIterator迭代器
  31.         public static int GetLastNumberFromQuene(int a, int b) {
  32.                 //创建两个List集合,分别用来存放总人数的元素,和迭代时被退出的元素
  33.                 List<Integer> arrList = new ArrayList<Integer> ();
  34.                 List<Integer> arrList_quit = new ArrayList<Integer> ();
  35.                 //使用for循环,逐个项arrList中添加元素,元素编号为自然数顺序
  36.                 for (int i = 0; i < a; i++) {
  37.                         arrList.add(i+1);
  38.                 }
  39.                 //创建一个迭代器,初始化为arrList的迭代器
  40.                 ListIterator<Integer> iter = arrList.listIterator();
  41.                 //开始执行判断和删除元素的过程。如果元素的长度不为1,继续执行
  42.                 while (arrList.size() > 1) {
  43.                         Integer temp = null;
  44.                         //for循环体用于执行一个报数轮回,即执行一次for语句,删除一个元素
  45.                         for (int x = 0; x < b; x++) {
  46.                                 //当迭代器遍历到集合末尾时,重新给iter赋值,使其指向集合的开头
  47.                                 if (!iter.hasNext()) {
  48.                                         iter = arrList.listIterator();
  49.                                         temp = iter.next();
  50.                                 }
  51.                                 //当没有遍历到末尾时,指向下一个元素,并返回给临时对象temp
  52.                                 else {
  53.                                         temp = iter.next();        
  54.                                 }        
  55.                         }
  56.                         //如果该集合长度不为1,将被删除的对象存储到arrList_quit集合中
  57.                         if (arrList.size() > 1)
  58.                                 arrList_quit.add(temp);
  59.                         try {
  60.                                 //然后删除这个元素
  61.                                 iter.remove();
  62.                         } catch (IllegalStateException e) {
  63.                                 e.printStackTrace();
  64.                         }
  65.                         //如果这句没有注释,将会打印每次遍历删除时,集合的所有值。可以更详细的看出,每次迭代删除的是哪一个元素。
  66. //                        System.out.println(arrList);
  67.                 }
  68.                 System.out.println("元素的退出顺序为:");
  69.                 //打印退出顺序
  70.                 System.out.println(arrList_quit);
  71.                 return arrList.get(0);
  72.         }
  73. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

1 个回复

正序浏览
这是入学测试的难度吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马