本帖最后由 周学彬 于 2013-10-24 16:26 编辑
做测试题时碰到了这题,觉得用数组太麻烦了。既然有集合这么强大的工具,有那么丰富的api可以用,为什么不用呢?于是灵机一动,就想到了使用ListIterator迭代器,边迭代,边删除。最后就实现了想要的功能。虽然效率不怎么高,但很容易理解却是真的,一点儿都不绕,就一个函数。如果觉得有问题的,欢迎提出来。- package com.itheima;
- import java.util.*;
- /**
- * 第十题:有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
- *
- * 思路:
- * 该题的实现方法比较多,比如用数组,Map集合,或双向链表方法等。这儿用的是我觉得最简单的方法,使用List集合特有的迭代器,ListIterator。该迭代器
- * 在迭代时,还能能对集合进行删除添加等并发操作。如果把100个有编号的元素存到List集合中,边迭代便删除要退出的元素,那便很容易实现了
- * 方法实现步骤:
- * 1,创建一个集合,该集合用于存放指定数目的,具有编号的元素。本题中即把1~100依次存放到集合中
- * 2,定义一个迭代器,指向该集合。
- * 3,开始迭代访问该集合。迭代到指定的次数,就删除该元素。如果迭代到了元素末尾,就重新指向该集合,即从头重新开始迭代
- * 4,当迭代到最后只剩一个元素时,停止迭代,并返回该元素。
- * 注意:
- * 在迭代的过程中,可以另外创建一个集合,用于存放被退出或删除的元素,这样就能看到程序的执行顺序了。
- * @author mrzhou
- *
- */
- public class Test10 {
- public static void main(String[] args) {
- //初始化排队总人数和报告的数
- int TotalNumber = 100;
- int CountNumber = 14;
- //调用自定义的方法,得到最后一个元素
- int TheLastNumber = GetLastNumberFromQuene(TotalNumber, CountNumber);
- //打印该元素
- System.out.println("剩下的最后一个元素是:" + TheLastNumber);
- }
-
- //定义该方法,使用ListIterator迭代器
- public static int GetLastNumberFromQuene(int a, int b) {
- //创建两个List集合,分别用来存放总人数的元素,和迭代时被退出的元素
- List<Integer> arrList = new ArrayList<Integer> ();
- List<Integer> arrList_quit = new ArrayList<Integer> ();
- //使用for循环,逐个项arrList中添加元素,元素编号为自然数顺序
- for (int i = 0; i < a; i++) {
- arrList.add(i+1);
- }
- //创建一个迭代器,初始化为arrList的迭代器
- ListIterator<Integer> iter = arrList.listIterator();
- //开始执行判断和删除元素的过程。如果元素的长度不为1,继续执行
- while (arrList.size() > 1) {
- Integer temp = null;
- //for循环体用于执行一个报数轮回,即执行一次for语句,删除一个元素
- for (int x = 0; x < b; x++) {
- //当迭代器遍历到集合末尾时,重新给iter赋值,使其指向集合的开头
- if (!iter.hasNext()) {
- iter = arrList.listIterator();
- temp = iter.next();
- }
- //当没有遍历到末尾时,指向下一个元素,并返回给临时对象temp
- else {
- temp = iter.next();
- }
- }
- //如果该集合长度不为1,将被删除的对象存储到arrList_quit集合中
- if (arrList.size() > 1)
- arrList_quit.add(temp);
- try {
- //然后删除这个元素
- iter.remove();
- } catch (IllegalStateException e) {
- e.printStackTrace();
- }
- //如果这句没有注释,将会打印每次遍历删除时,集合的所有值。可以更详细的看出,每次迭代删除的是哪一个元素。
- // System.out.println(arrList);
- }
- System.out.println("元素的退出顺序为:");
- //打印退出顺序
- System.out.println(arrList_quit);
- return arrList.get(0);
- }
- }
复制代码 |