黑马程序员技术交流社区
标题:
这个题帮我看一下,自己写的 不出结果是怎么回事呢
[打印本页]
作者:
Love丶cd
时间:
2016-4-28 14:44
标题:
这个题帮我看一下,自己写的 不出结果是怎么回事呢
package day1;
import java.util.ArrayList;
/*有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。
然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
*/
public class Text7 {
public static void main(String[] args){//throws IOException {
ArrayList<Integer> list=getList();
ArrayList<Integer> list2=getNum(list);
System.out.println(list2);
}
//将一百个数存放在集合中,要存储的元素都是有序的,所以要用List集合来存储
public static ArrayList<Integer> getList(){
ArrayList<Integer> list=new ArrayList<Integer>();
for(int i=1;i<=100;i++)
list.add(new Integer(i));
return list;
}
//遍历数组,每当数到第14个就删除该元素
public static ArrayList<Integer> getNum(ArrayList<Integer> list){
//遍历集合
for(Integer i:list){
//只要集合中的元素大于一个就继续遍历
while(list.size()>1){
//每到第14个就删除该元素
int index=1;
if(index%14==0)
list.remove(i);
else
continue;
index++;
}
}
return list;
}
}
作者:
Love丶cd
时间:
2016-4-28 14:46
自己已经钻进牛角尖了,你们帮我分析一下,谢谢了
作者:
jy6728228
时间:
2016-4-28 14:48
你不能在遍历的时候删除元素,你可以吧这个下标记到一个新的集合里面。等执行完了 先用A.size-B.size得到还剩多少人。 再A.removeAll(b); A的集合就是正常的了额
作者:
Love丶cd
时间:
2016-4-28 14:51
哦哦,现在是同时对集合进行了多步操作了对吧,虽然删除了该元素,但还是可以输出的 。。。我日,我给忘了!谢谢!!!!
作者:
Love丶cd
时间:
2016-4-28 14:53
jy6728228 发表于 2016-4-28 14:48
你不能在遍历的时候删除元素,你可以吧这个下标记到一个新的集合里面。等执行完了 先用A.size-B.size得到还 ...
哦哦,现在是同时对集合进行了多步操作了对吧,虽然删除了该元素,但还是可以输出的 。。。我日,我给忘了!谢谢!!!!
作者:
BackGaoz
时间:
2016-4-28 15:42
package com.heima.test;
import java.util.ArrayList;
public class Test13_约瑟夫环升级版 {
/*
* 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。
* 问:最后剩下的是100人中的第几个人?
*/
public static void main(String[] args) {
System.out.println(getLuckyNum(100)); //有多少人,参数就传多少
}
/*
* 获取幸运数字
* 方法
* 返回值类型 int
* 参数列表 int num
*/
public static int getLuckyNum(int num) {
ArrayList<Integer> list = new ArrayList<>(); //首先有一个有序集合list来存储人
for (int i = 1; i <= num; i++) { //把人装进集合中,传入多少,就有序装多少
list.add(i);
}
int count = 1; //用来报数,从1开始
for (int i = 0; list.size() > 1; i++) { //因为只需要剩一个人,所以,集合中的元素个数只要大于1
//这个循环就一直进行
if (count == 15) { //到14之后,14退出.其他人要重新开始开始报数
count = 1; //所以只要count等于了15,就把count置为1
}
if (i == list.size()) { //报数的人我们是通索引获取,只要索引等于了list.size()
i = 0; //把索引置为0,就相当于排成一个圈
}
if (count == 14) { //如果报数报到14
list.remove(i--); //报数的这个人就退出,同时,后边的人向前挪一位,所以i--
}
count++; //每次报数都会++;
}
return list.get(0); //到最后只剩一个人,就是list.get(0)索引对应的值.
}
}
复制代码
这就是约瑟夫环,代码其实可以继续优化,这样做显得太麻烦了,你可以参考一下我写的.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2