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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 哈达洋 于 2014-10-18 20:47 编辑

有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。
然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?


下面是我的解决方案,希望看看大家的解决方式,有没有更简单的?互相学习。
  1. import java.util.*;
  2. class test110
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 //定义一个arraylist集合存储元素
  7.                 ArrayList<Integer> al = new ArrayList<Integer>();

  8.                         //向集合中添加100个元素(1-100数字)
  9.                         for(int i=1;i<=100;i++)
  10.                         {
  11.                                 al.add(i);
  12.                         }
  13.                 method_1(al);
  14.         }

  15.         public static void method_1(ArrayList<Integer> al)
  16.         {
  17.                 //此处定义一个集合,是为了方便后面删除元素用。
  18.                 ArrayList<Integer> buf = new ArrayList<Integer>();
  19.                
  20.                 //定义一个计数器,记录大家的报数。
  21.                 int count=0;

  22.                 //一直循环报数(1-100转完一圈再继续转的意思),删除元素,直到只剩下一个元素
  23.                 while(true)
  24.                 {
  25.                         //判断元素是否为1
  26.                         if(al.size()>1)
  27.                         {
  28.                                 //100个人内部1-14循环报数
  29.                                 for(int index=0;index<al.size();index++)
  30.                                 {
  31.                                         //进入循环一次,计数器+1
  32.                                         count++;

  33.                                         //判断判断报的数是否为14的倍数,这里对1-14循环报数稍微做了下转换,应该不难理解
  34.                                         if(count%14==0)
  35.                                         {
  36.                                                 //如果该角标的报数为14的倍数,则将该元素添加到上面定义好的buf集合。
  37.                                                 buf.add(al.get(index));        
  38.                                         }
  39.                                 }

  40.                                 //一次性删除al集合中包含的buf集合中的元素。
  41.                                 al.removeAll(buf);
  42.                                 //清空buf集合
  43.                                 buf.clear();
  44.                         }
  45.                         else
  46.                                 break;
  47.                 }

  48.                 System.out.println(al);
  49.         }
  50. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

20 个回复

倒序浏览
  1. import java.util.*;
  2. class  Demo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 System.out.println(getSimple(100));
  7.         }
  8.         public static int getSimple(int max)
  9.         {
  10.                 //定义一个数组,装入1到指定的100的所有值
  11.                 ArrayList<Integer> arr=new ArrayList<Integer>();
  12.                 for(int x=1;x<=max;x++)
  13.                 {
  14.                         arr.add(x);
  15.                 }
  16.                 //定义一个计数器
  17.                 int count=0;
  18.                 int num;
  19.                 //开始循环,对集合进行遍历
  20.                 while(true)
  21.                 {
  22.                         //遍历的时候country自加,遍历到14的时候减去对应的集合中的值并将count归0
  23.                         for(int x=0;x<arr.size();x++)
  24.                         {
  25.                                 count++;
  26.                                 if(count%14==0)
  27.                                 {
  28.                                         arr.remove(x);
  29.                                         count=0;
  30.                                 }
  31.                         }
  32.                         //判断当集合中只有一个元素时返回。
  33.                         if(arr.size()==1)
  34.                         {
  35.                                 num=arr.get(0);
  36.                                 return num;
  37.                         }
  38.                 }

  39.         }
  40. }
复制代码
思想差不多,我感觉这样能简单点

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
刘家斌 发表于 2014-10-18 21:23
思想差不多,我感觉这样能简单点

刚刚运行了下你的代码,发现了个小错误。你的第28行代码:arr.remove(x),这句话一执行,arr就变了,那么它从删除元素角标以后的元数角标也随之变化了,都往前进了1。当再运行到arr.remove(x)时,这里的x还是按原来的角标在删除元素,所以这时候删除的不再是你想要删除的元素。我搞两个集合的目的就这消除这里的问题。你可以再看看。
回复 使用道具 举报
哈达洋 发表于 2014-10-18 22:07
刚刚运行了下你的代码,发现了个小错误。你的第28行代码:arr.remove(x),这句话一执行,arr就变了,那么 ...

你的意思是在for循环里面第一次被删除一个元素,循环里的size就变了吗
回复 使用道具 举报
刘家斌 发表于 2014-10-18 22:09
你的意思是在for循环里面第一次被删除一个元素,循环里的size就变了吗

嗯恩,是的。
回复 使用道具 举报

这样啊,我在看看,谢谢提醒啊
回复 使用道具 举报
刘家斌 发表于 2014-10-18 22:12
这样啊,我在看看,谢谢提醒啊

恩恩,互相学习
回复 使用道具 举报
我觉得第二个 对arr重新赋值一下就可以了。this.arr= arr
回复 使用道具 举报
qq8921310 发表于 2014-10-18 22:32
我觉得第二个 对arr重新赋值一下就可以了。this.arr= arr

你是说调用完arr.remove()后,重新赋值吗?如果是这个的意思话,就没必要,因为arr.remove()后,arr就已经变成删完后的集合了。因为它底层调用的是System.arrayCopy()方法,在 原来的arr上直接修改的,所以不需要重新赋值了。
回复 使用道具 举报
哈达洋 发表于 2014-10-18 22:39
你是说调用完arr.remove()后,重新赋值吗?如果是这个的意思话,就没必要,因为arr.remove()后,arr就已经 ...

确实是,是我没理解对。
回复 使用道具 举报

这样应该是对的import java.util.*;
class  Demo
{
        public static void main(String[] args)
        {
                ArrayList<Integer>  s=getSimple(100);
                System.out.println(s.get(0));

        }
        public static ArrayList<Integer> getSimple(int max)
        {
                //定义一个数组,装入1到指定的100的所有值
                ArrayList<Integer> arr=new ArrayList<Integer>();
                for(int x=1;x<=max;x++)
                {
                        arr.add(x);
                }
                //定义一个计数器
                int count=0;
                //开始循环,对集合进行遍历
                while(arr.size()>1)
                {
                        //遍历的时候count自加
                        for(ListIterator<Integer> li=arr.listIterator();li.hasNext();)
                        {
                                Integer i=li.next();
                                count++;
                                if(count==14)
                                {
                                        li.remove();
                                        count=0;
                                }
                        }
                        //判断当集合中只有一个元素时返回。
                }
                return arr;
        }
}
回复 使用道具 举报
随便看看,还不懂。。。。
回复 使用道具 举报
  1. package com.itheima.test;
  2. import java.util.*;
  3. public class Test100
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 // ------------输入学生人数---------------------
  8.                 int num = 100; //学生人数.
  9.                 int outNum = 14; //第几个人出局.
  10.                 // ------------制作列表-------------------------
  11.                 List<Integer> list = new ArrayList<Integer>();
  12.                 for (int x = 0; x < num; x++)
  13.                 {
  14.                         list.add(x + 1);
  15.                 }
  16.                 // --------------------------------------------
  17.                 int i = method(list, outNum);
  18.                 System.out.println("第"+i+"人");// 返回答案.
  19.         }
  20.         public static int method(List<Integer> list, int outNum)
  21.         {
  22.                 int index = -1;
  23.                 while (list.size() != 1)
  24.                 {
  25.                         for (int x = 1; x <= outNum; x++)
  26.                         {
  27.                                 index++;
  28.                                 if (index >= list.size())
  29.                                 {
  30.                                         index = 0;
  31.                                 }
  32.                         }
  33.                         list.remove(index);
  34.                         index--;
  35.                 }
  36.                 return list.get(0);
  37.         }
  38. }
复制代码

答案是 92 对吧?
回复 使用道具 举报
本帖最后由 想飞的鱼 于 2014-10-19 20:01 编辑
  1. package com.itheima;

  2. import java.util.ArrayList;

  3. public class Test1 {
  4.         public static void main(String[] args) {
  5.                 // 创建初始长度为100的集合,并添加元素
  6.                 ArrayList<Integer> al = new ArrayList<Integer>();
  7.                 for (int x = 1; x <= 100; x++) {
  8.                         al.add(x);
  9.                 }

  10.                 int pos = 13;
  11.                 while (al.size() != 1) {
  12.                         while (pos > al.size() - 1) {
  13.                                 pos = pos - al.size();
  14.                         }
  15.                        al.remove(pos);

  16.                         pos = pos + 13;
  17.                 }
  18.                 System.out.println("最后一个数字为:" + al.get(0));//结果是:92
  19.         }
  20. }
复制代码


以上是我的代码,答案92
回复 使用道具 举报
不错不错
回复 使用道具 举报
AsWind 初级黑马 2015-11-12 09:12:23
16#
刘家斌 发表于 2014-10-18 21:23
思想差不多,我感觉这样能简单点

为什么for(int x=0;x<arr.size();x++)不能用for(int x=0;arr.size()!=1;x++)来判断?
                       
回复 使用道具 举报
逻辑算是看懂了
回复 使用道具 举报
P神 中级黑马 2016-3-10 17:31:14
18#
答案到底是71  还是 92
回复 使用道具 举报

没错,我也是92
回复 使用道具 举报
刘家斌 发表于 2014-10-18 21:23
思想差不多,我感觉这样能简单点

时间复杂度多少?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马