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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhu_zhu 中级黑马   /  2014-9-18 23:40  /  2478 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
测试题已经交了,想和大家请教下答案。我感觉我把这道题想简单了呢。还望大神指点

14 个回复

倒序浏览
本帖最后由 dreamseekerkun 于 2014-9-19 00:36 编辑

我入学测试也抽到了这个题,100个人最后剩下14个人时,第14个就是结果,定义一个集合存储100个数,定义一个循环while(true),同时定义一个计数器count,里面不断遍历这个集合
当count加到14时,同时也是遍历到的第14个数字,就用迭代器的remove方法删除,remove可以删除最后返回的一个元素同时把count归0
不断循环,直到集合中元素个数为14时,跳出循环,最后一个就是答案
这是我做的
public class Test10 {
        public static void main(String[] args) {
                //定义一个ArrayList集合用来存储数值
                ArrayList<Integer> list = new ArrayList<Integer>();
                //默认添加100个数值
                for (int i = 0; i < 100; i++)
                {
                        list.add(i + 1);
                }
                getnum(list);        
        }
        public static void getnum(List<Integer> list) {
                //定义一个计数器
                int count = 0;
                //只要List集合中元素的个数不等于14,就一直循环
                label: while (true)
                {
                        //迭代器遍历集合
                        Iterator<Integer> it = list.iterator();
                        while (it.hasNext())
                        {
                                int i = it.next();
                                count++;
                                //当count数到14时就把对应那个元素删除
                                if (count == 14)
                                {
                                        //当集合中元素个数等于14时,跳出循环,迭代的最后一个元素就是最后那个数到14的人
                                        if (list.size() == 14)
                                        {
                                                //count计数器等于14并且集合中元素个数有等于14,取出这最后一个元素
                                                System.out.println(list.get(count-1));
                                                //把这个最后数到14的人删除
                                                it.remove();
                                                break label;
                                        }
                                        else
                                        {
                                                //迭代器的remove方法可以删除返回的最后一个元素
                                                it.remove();
                                                //当count=14时,就把count置于0,重新开始计数
                                                count = 0;
                                        }
                                }
                        }
                }
        }
}



回复 使用道具 举报
这个就是最后剩下两个人也能继续报数的   
回复 使用道具 举报

  1. public class Test_02 {

  2.         /**100人围一圈  轮流报数 数到14退 问最后一人在原来的哪个 位置
  3.          * @param args
  4.          *
  5.          * 思路:把这当成100长度数组 不停遍历   轮到9时 数组这位置换一个值  标记下  直到最后一个没标记
  6.          *                 的再退出
  7.          */
  8.         public static void main(String[] args)
  9.         {
  10.                         // TODO Auto-generated method stub
  11.                 int m = 100;
  12.                 int n = 14 ;
  13.                        
  14.                 int index = where(m,n)+1;
  15.                
  16.                        
  17.                 System.out.println(index);
  18.         }

  19.        
  20.        
  21.         public static int where(int m, int n)        
  22.         {                //定义一个长度为m的字数,默认全是false
  23.                 boolean[] bool = new boolean[m];
  24.                         //定义还剩下的人数
  25.                 int i = m;        
  26.                         //每次报计数
  27.                 int j = 0;
  28.                         //循环判断  如果只剩下最后一个退出
  29.                 while(i!=1)
  30.                 {        // 累加 , 当加到n时  计数清0  值改为true  累加时值为true不加
  31.                         for(int k=0;k<bool.length;k++)
  32.                         {
  33.                                 if(bool[k]==true) continue;
  34.                                 j++;
  35.                                 if(j==n)
  36.                                 {
  37.                                         j=0;
  38.                                         bool[k]=true;
  39.                                         i--;
  40.                                 }
  41.                         }
  42.                 }
  43.                         //遍历 查哪个位置还是false 返回
  44.                 for(int k=0 ;k<bool.length;k++)
  45.                 {
  46.                        
  47.                         if(bool[k]==false)
  48.                         {
  49.                                 return k;
  50.                         }
  51.                 }
  52.                         return 0;
  53.         }

  54. }
复制代码
回复 使用道具 举报
第92个,
回复 使用道具 举报
dreamseekerkun 发表于 2014-9-19 00:33
我入学测试也抽到了这个题,100个人最后剩下14个人时,第14个就是结果,定义一个集合存储100个数,定义一个 ...

也就是说,退出一个之后是从下一个人重新开始是吧。。
回复 使用道具 举报
zhu_zhu 发表于 2014-9-19 08:11
也就是说,退出一个之后是从下一个人重新开始是吧。。

。。。怎么换不了行,不小心提交了。   谢谢指点,醍醐灌顶啊,果然是我考虑的简单了,没想到用count计算,,,完全用的下标。。。。
回复 使用道具 举报
dreamseekerkun 发表于 2014-9-19 00:33
我入学测试也抽到了这个题,100个人最后剩下14个人时,第14个就是结果,定义一个集合存储100个数,定义一个 ...

。。。怎么换不了行,不小心提交了。   谢谢指点,醍醐灌顶啊,果然是我考虑的简单了,没想到用count计算,,,完全用的下标。。。。
回复 使用道具 举报

我答案错的太离谱了,,,,,,,伤心,,
回复 使用道具 举报

感谢指点!这个代码的一般性太强了,要思考一会
回复 使用道具 举报
         **** 思路:把这当成100长度数组 不停遍历   轮到9时 数组这位置换一个值  标记下  直到最后一个没标记

这地方先说下哈  是轮到14时 数组这位置换一个值做标记  开始随便用9测的  后来发的时候没注意 没改回来

其实就是数到14的时候 标记  下次数的时候直接跳过这个数接着轮流报数
回复 使用道具 举报
本帖最后由 李天富 于 2014-9-19 11:41 编辑

约瑟夫环吧。
  1. /*
  2. 思路:新建一个长度为100的数组,然后不断遍历,并用temp记录空值位,
  3. 每当temp==14的时候,将该位赋值为1(或非空的其他值,就是做个标记),
  4. 同时用count记录数组中值为1的个数,并将temp清零,当count==99的时候,
  5. 也就是数组中只剩下一个空值位时停止遍历。最后遍历一次数组,找到空值位
  6. 的角标x,并返回x+1(因为数组是从0开始编号,所以要加1).






  7. */



  8. class  Joseph
  9. {
  10.         public static void main(String[] args)
  11.         {
  12.                 int x=Joseph(100,14);
  13.                
  14.                 System.out.println("x="+x);
  15.         }
  16.         public static int Joseph(int n,int k)
  17.         {
  18.                 int[] a=new int[n];
  19.                 int count=0,temp=0,x=0;//count:记录数组中值为1的元素个数,temp:记录遍历到的空值的个数
  20.                 while (count<n-1)//不断遍历,只到数组中只剩一个空值位。
  21.                 {
  22.                         for (int i=0;i<a.length ; i++)
  23.                         {
  24.                                 if(a[i]!=1)//因为数组默认初始化值为空,所以不等于1就是表示空位。
  25.                                         temp++;
  26.                                 if(temp==k)
  27.                                 {
  28.                                         a[i]=1;
  29.                                         count++;
  30.                                         temp=0;
  31.                                 }
  32.                                        

  33.                         }
  34.                 }
  35.                 for (int i=0;i<a.length ;i++ )//最后一次遍历,获取剩余最后一个空值位的角标。
  36.                 {
  37.                         if (a[i]!=1)
  38.                         {
  39.                                 x=i;
  40.                                 break;
  41.                         }
  42.                         

  43.                 }
  44.                 return x+1;
  45.         }
  46. }
复制代码
回复 使用道具 举报
我怎么觉得92是最后一个移出去的人呢?
回复 使用道具 举报
  1. class aaa
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int N = 100;
  6. int s = 0;
  7. int m = 14;
  8. for(int i=2; i<=N; i++) {
  9. s = (s+m)%i;
  10. System.out.println(s);
  11. }
  12. System.out.println("最终会留下的人的编号为:" + (s+1));

  13.         }
  14. }
复制代码



网上找到的最简算法,不知道什么思路
回复 使用道具 举报
来看看我写的:约瑟夫环问题全攻略http://bbs.itheima.com/thread-144249-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马