黑马程序员技术交流社区
标题:
使用for循环和迭代器两种方法解决约瑟夫环问题
[打印本页]
作者:
怪人长
时间:
2016-3-20 22:44
标题:
使用for循环和迭代器两种方法解决约瑟夫环问题
本帖最后由 怪人长 于 2016-3-20 22:45 编辑
public class Demo02 {
/**
* 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,
* 从1报数,到14退出。问:最后剩下的是100人中的第几个人?
*/
public static void main(String[] args) {
int n = 100;
method1(n);
method2(n);
}
public static void method1(int n) {
ArrayList<Integer> arr = new ArrayList<Integer>();
for (int i = 1; i <= n; i++) {
arr.add(i);
}
int count = 0;
int num = 0;
int k = 0;
int p = 0;
while(arr.size()>1) {
for (int j = 0; j < arr.size(); j++) {
// for (ListIterator<Integer> li = arr.listIterator(); li.hasNext();) {
// Integer j = li.next();//如果使用该条件作为for循环的条件,也无下述隐患
count++;
if (count == 14) {
k++;
System.out.println("第" + k +"次" + arr.get(j) + "退出");
arr.remove(j);//该方法有隐患,就是该句不能再上句前,否则会出现索引越界异常;
count = 0;
j--; //注意:在删除元素之后,后面的元素角标都会变化,所以需要索引位移;
}
}
}
if (arr.size() == 1) {
num = arr.get(0);
System.out.println("剩下的是" + num);
}
}
public static void method2(int n) {
ArrayList<Integer> arr = new ArrayList<Integer>();
for (int i = 1; i <= n; i++) {
arr.add(i);
}
int count = 0;
int num = 0;
int k = 0;
while(arr.size()>1) {
ListIterator<Integer> li = arr.listIterator();
while(li.hasNext()) {
Integer j = li.next();
count++;
if (count == 14) {
k++;
System.out.println("第" + k +"次" + j + "退出");
li.remove();
count = 0;
}
}
}
if (arr.size() == 1) {
num = arr.get(0);
System.out.println("剩下的是" + num);
}
}
}
复制代码
作者:
yuzy521
时间:
2016-3-22 17:39
学习了 迭代的不错
作者:
lgdbest
时间:
2016-3-22 18:24
思路写清晰点 不是很明白
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2