黑马程序员技术交流社区

标题: 入学测试题提交了,但最后一题真心想不出来? [打印本页]

作者: 赵太云    时间: 2013-7-19 09:05
标题: 入学测试题提交了,但最后一题真心想不出来?
本帖最后由 赵太云 于 2013-7-19 09:42 编辑

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

求思路。。。{:soso_e149:}{:soso_e149:}{:soso_e149:}{:soso_e149:}{:soso_e149:}{:soso_e149:}{:soso_e149:}

作者: 水。。。海    时间: 2013-7-19 09:11
最后剩下的应该是第一位到第十三位,后面的都退出了
作者: 赵太云    时间: 2013-7-19 09:16
水。。。海 发表于 2013-7-19 09:11
最后剩下的应该是第一位到第十三位,后面的都退出了

求思路。。。。。。。。。。。。。。。。。。
作者: chslzj    时间: 2013-7-19 09:16
看我的分享,我都分享出来了
作者: 赵太云    时间: 2013-7-19 09:17
chslzj 发表于 2013-7-19 09:16
看我的分享,我都分享出来了

老天保佑。。。。。。。。。。。。。。。。。
作者: chslzj    时间: 2013-7-19 09:26
赵太云 发表于 2013-7-19 09:17
老天保佑。。。。。。。。。。。。。。。。。

里面有很多是为了测试输出来,看结果的是否对的
作者: asd8905047    时间: 2013-7-19 09:50
每到14位退出一人,之后从新开始,这点可以知道:从第14位到100位开始,都会给14直接刷掉;
之后剩下13个人,需要刷掉12人:
报数次数            :1  2  3  4  5  6  7  8  9   10  11  12  13  14
从13个人后的分析:1  2  3  4  5  6  7  8  9   10  11  12  13  1 ,刷掉1,剩下12人
从12个人后的分析:2  3  4  5  6  7  8  9  10 11 12  13   2   3 ,刷掉3,剩下11人
从11个人后的分析:2  4  5  6  7  8  9  10 1112  13  2    4    5,刷掉5,剩下10人
从10个人后的分析:2  4  6  7  8  9  10 1112 13  2   4    6    7,刷掉7,剩下9人
从09个人后的分析 : 2  4  6  8  9  10 111213  2   4   6    8    9,刷掉9,剩下8人
从08个人后的分析:2  4  6  8  10 1112 13 2  4   6   8   10   11,刷掉11,剩下7人
从07个人后的分析:2  4  6  8  10 1213 2 4   6   8    10  12  13 ,刷掉13,剩下6人
从06个人后的分析:2  4  6  8  10 12 2  4  6  8  10  12   2    4  ,刷掉4,剩下5人........
大概就是这样,有规律,自己总结,我现在要去看看面对对象的基础教学了{:soso_e130:}刚刚学了第五天
要用到的知识(我自己知道的):组队,多重循环,取余,IF


作者: asd8905047    时间: 2013-7-19 09:51
数组.......

作者: 赵太云    时间: 2013-7-19 09:53
asd8905047 发表于 2013-7-19 09:50
每到14位退出一人,之后从新开始,这点可以知道:从第14位到100位开始,都会给14直接刷掉;
之后剩下13个人 ...

公然的调戏。。。。。。。。。。。。。。。。。。。
作者: 赵太云    时间: 2013-7-19 09:54
asd8905047 发表于 2013-7-19 09:50
每到14位退出一人,之后从新开始,这点可以知道:从第14位到100位开始,都会给14直接刷掉;
之后剩下13个人 ...

不是每次从1开始的吧,14退出了,15就成1了。。。。。。。。。。。。。。
作者: asd8905047    时间: 2013-7-19 09:55
14取 i-- 的余数,取出来后用数组来存,之后看看少了谁,暴力数学的思想(i<=13)

作者: asd8905047    时间: 2013-7-19 09:57
然后其他人重新开始a1
作者: asd8905047    时间: 2013-7-19 09:57
看清楚啊

作者: 赵太云    时间: 2013-7-19 09:58
asd8905047 发表于 2013-7-19 09:55
14取 i-- 的余数,取出来后用数组来存,之后看看少了谁,暴力数学的思想(i ...

不懂什么暴力数学,没上过大学。。。
作者: 赵太云    时间: 2013-7-19 10:01
asd8905047 发表于 2013-7-19 09:57
看清楚啊

:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q
作者: asd8905047    时间: 2013-7-19 10:03
赵太云 发表于 2013-7-19 09:58
不懂什么暴力数学,没上过大学。。。

题目你都看错了,我大学没学过数学
作者: 赵太云    时间: 2013-7-19 10:07
asd8905047 发表于 2013-7-19 10:03
题目你都看错了,我大学没学过数学

   你嬴了。。。。。。。。。。。。
作者: 傻瓜一点红    时间: 2013-7-19 10:32
这个题不算难,只是算法问题,可以有很多方法实现,之前有人问过这个题了,可以用集合,把所有数字添加到一个ArrayList集合,然后写一个循环调用方法remove就可以了,最后剩下的数字好像是97(如果我没记错的话),这是其中的一种方法,这个类似的帖子你可以在论坛找一下,那个帖子上提供了很多种方法
作者: chslzj    时间: 2013-7-19 11:01
傻瓜一点红 发表于 2013-7-19 10:32
这个题不算难,只是算法问题,可以有很多方法实现,之前有人问过这个题了,可以用集合,把所有数字添加到一 ...

92吧。。。
作者: 傻瓜一点红    时间: 2013-7-19 11:33
chslzj 发表于 2013-7-19 11:01
92吧。。。

具体结果不是很清楚了,但好像记得是97,呵呵,自己写代码运算一下就知道了,我这只是提供一种思路
作者: 水。。。海    时间: 2013-7-19 11:52
这个题目的原题就是这个样子?还是我理解的太简单,为什么上面的各位仁兄说的那么复杂
作者: 周之浩    时间: 2013-7-19 11:54
以前同学参加蓝桥杯初赛时问过我一个类似的问题,由于填空题,每天注意,只记得好像是用Vector来处理的。把它们看做一个循环队列,每报一个判断它是14吗?不是就将它接到队列的尾部,是就将它remove掉这样循环就能求出最后剩下的那个人啦
这只提供思路啦,如果有时间帮你写个程序啊
作者: 傻瓜一点红    时间: 2013-7-19 12:06
水。。。海 发表于 2013-7-19 11:52
这个题目的原题就是这个样子?还是我理解的太简单,为什么上面的各位仁兄说的那么复杂 ...

这个题看起来是很简单,纯属就一算法,但你要用代码去实现相对就麻烦得多了
作者: 水。。。海    时间: 2013-7-19 12:31
傻瓜一点红 发表于 2013-7-19 12:06
这个题看起来是很简单,纯属就一算法,但你要用代码去实现相对就麻烦得多了 ...

但是照我的理解就是把14和它的倍数去掉就行了
作者: 徐卓    时间: 2013-7-19 13:45
结果是  16.29.36.39.47.55.72.74.75.80.90.91.92我搞出来了
作者: 傻瓜一点红    时间: 2013-7-19 14:38
水。。。海 发表于 2013-7-19 12:31
但是照我的理解就是把14和它的倍数去掉就行了

呵呵,你这样理解就错了,你这样得到的结果肯定是错的,当最后剩下的14个数时可能都不是14的倍数,但还得继续循环,就算剩下两个数的时候都还得继续用14来循环,直到只剩下一个数为止
作者: 徐卓    时间: 2013-7-19 14:44
才看视频到 ArrayList的路过代码如下
  1. import java.util.*;
  2. class TopicDemo
  3. {
  4.         public static void main(String []arg)
  5.         {
  6.                 ArrayList first = new ArrayList();     //定义集合为first
  7.                 int number = 14;                        //每次报数的点
  8.                 for (int i=1;i<=100 ;i++ )  //在集合加入1~100
  9.                 {
  10.                         first.add(i);
  11.                 }
  12.                 sop(first);
  13.                 sop(first.size());
  14.                 Count(first,number);                //开始计算
  15.                 sop(first);
  16.                 sop(first.size());
  17.         }
  18.         private static ArrayList Count(ArrayList arl,int num)
  19.         {
  20.                 for (int x=arl.size(); x>=num; x--)//一次一次报数
  21.                 {
  22.                         arl.remove(num-1);                                //每到14时踢掉一个
  23.                         ArrayList changeCollection = new ArrayList();//定义另一个集合用来装下first中的前13个数
  24.                         for (int a = 0;a<num-1 ;a++ )                        //把first中的前13个数装在changeCollection中,并且删掉first内部的前13个数
  25.                         {
  26.                                 changeCollection.add(arl.get(0));
  27.                                 arl.remove(0);
  28.                         }
  29.                         for (int a =0;a<num-1 ; a++)                //把changeCollection中的数重新放入first中,并且放在最后
  30.                         {
  31.                                 arl.add(changeCollection.get(a));
  32.                         }

  33.                 }
  34.                 return arl;
  35.         }
  36.         public static void sop(Object obj)
  37.         {
  38.                 System.out.println(obj);
  39.         }
  40. }
复制代码
写的代码不好看

QQ截图20130719144359.png (659 Bytes, 下载次数: 0)

QQ截图20130719144359.png

作者: 牛海亮    时间: 2013-7-19 15:40
用LinkedList
作者: 禾呈    时间: 2013-7-19 16:35
我的也是这道题 ,我算的是第44人 。


作者: HEIMA时光    时间: 2013-7-21 12:22
这就是入学测试题?看看怎么解决的...
作者: 刘张朋    时间: 2013-7-21 13:59
不知道你做出来没啊,不过我有一个想法,可以相互学习:我的思路是建立在删除第14个后,接下来的第15数重新从1开始计数14个删除。如果题目理解错了那我的方法不再适用。如果哥们有什么好的方法可以相互探讨啊。

先将100个数装到ArrayList里,然后定义一个指针,用来记录要删除的第十四个数;用两个嵌套的for循环,内循环做14次循环,循序中指针加1,内循环没完成14次,删除指针对应的数。当指针的值为集合长度时,指针重置为0;到最后剩下一个元素时,那么最后那个元素的值就是要找的数。
总之内循环14次要删除一个数。其次要注意指针的变化。



作者: 赵太云    时间: 2013-7-21 14:44
刘张朋 发表于 2013-7-21 13:59
不知道你做出来没啊,不过我有一个想法,可以相互学习:我的思路是建立在删除第14个后,接下来的第15数重新 ...

恩,呵呵,不错。。。。。。。。。。
作者: 十万一千    时间: 2014-10-8 16:17
  1. package com.itheima.test;

  2. import java.util.LinkedList;
  3. import java.util.List;

  4. public class 踢数 {
  5.         // 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
  6.         public static void main(String[] args) {
  7.                 List<Integer> circle = new LinkedList<Integer>();
  8.                 for (int i = 1; i <= 100; i++) {
  9.                         circle.add(i);
  10.                 }
  11.                 System.out.println("剩余编号:" + ti(circle, 1, 14));
  12.         }

  13.         private static Integer ti(List<Integer> circle, Integer first, Integer kill) {
  14.                 if (circle.size() == 1) {
  15.                         return circle.get(0);
  16.                 } else {
  17.                         for (int i = 0; i < circle.size(); i++) {
  18.                                 if (first == kill) {
  19.                                         circle.remove(i);
  20.                                         first = 0;
  21.                                         i--;
  22.                                 }
  23.                                 first++;
  24.                         }
  25.                         return ti(circle, first, kill);
  26.                 }
  27.         }
  28. }
复制代码



作者: 惠惠惠惠惠    时间: 2014-12-12 09:08
我也要开始做入学测试了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2