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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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;


    }

}


5 个回复

倒序浏览
自己已经钻进牛角尖了,你们帮我分析一下,谢谢了
回复 使用道具 举报
你不能在遍历的时候删除元素,你可以吧这个下标记到一个新的集合里面。等执行完了 先用A.size-B.size得到还剩多少人。 再A.removeAll(b);  A的集合就是正常的了额
回复 使用道具 举报
哦哦,现在是同时对集合进行了多步操作了对吧,虽然删除了该元素,但还是可以输出的 。。。我日,我给忘了!谢谢!!!!
回复 使用道具 举报
jy6728228 发表于 2016-4-28 14:48
你不能在遍历的时候删除元素,你可以吧这个下标记到一个新的集合里面。等执行完了 先用A.size-B.size得到还 ...

哦哦,现在是同时对集合进行了多步操作了对吧,虽然删除了该元素,但还是可以输出的 。。。我日,我给忘了!谢谢!!!!
回复 使用道具 举报
  1. package com.heima.test;

  2. import java.util.ArrayList;

  3. public class Test13_约瑟夫环升级版 {
  4.         /*
  5.          * 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。
  6.          * 问:最后剩下的是100人中的第几个人?
  7.          */

  8.         public static void main(String[] args) {
  9.                 System.out.println(getLuckyNum(100));                                                                                //有多少人,参数就传多少
  10.         }
  11.        
  12.         /*
  13.          * 获取幸运数字
  14.          * 方法
  15.          * 返回值类型 int
  16.          * 参数列表 int num
  17.          */
  18.         public static int getLuckyNum(int num) {
  19.                 ArrayList<Integer> list = new ArrayList<>();                                                                                        //首先有一个有序集合list来存储人
  20.                 for (int i = 1; i <= num; i++) {                                                                                                                        //把人装进集合中,传入多少,就有序装多少
  21.                         list.add(i);
  22.                 }
  23.                
  24.                 int count = 1;                                                                                                                                                                //用来报数,从1开始
  25.                 for (int i = 0; list.size() > 1; i++) {                                                                                                                //因为只需要剩一个人,所以,集合中的元素个数只要大于1
  26.                                                                                                                                                                                                                 //这个循环就一直进行
  27.                         if (count == 15) {                                                                                                                                                //到14之后,14退出.其他人要重新开始开始报数
  28.                                 count = 1;                                                                                                                                                        //所以只要count等于了15,就把count置为1
  29.                         }
  30.                         if (i == list.size()) {                                                                                                                                                //报数的人我们是通索引获取,只要索引等于了list.size()
  31.                                 i = 0;                                                                                                                                                                        //把索引置为0,就相当于排成一个圈
  32.                         }
  33.                         if (count == 14) {                                                                                                                                                //如果报数报到14
  34.                                 list.remove(i--);                                                                                                                                                //报数的这个人就退出,同时,后边的人向前挪一位,所以i--
  35.                         }
  36.                         count++;                                                                                                                                                                        //每次报数都会++;
  37.                 }
  38.                 return list.get(0);                                                                                                                                                        //到最后只剩一个人,就是list.get(0)索引对应的值.
  39.         }

  40. }
复制代码
这就是约瑟夫环,代码其实可以继续优化,这样做显得太麻烦了,你可以参考一下我写的.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马