黑马程序员技术交流社区
标题:
100个人报数,报到14的退出,最后一个留下的是谁
[打印本页]
作者:
周学彬
时间:
2013-10-24 16:16
标题:
100个人报数,报到14的退出,最后一个留下的是谁
本帖最后由 周学彬 于 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);
}
}
复制代码
作者:
黑马戴帅军
时间:
2013-10-24 20:32
这是入学测试的难度吗?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2