黑马程序员技术交流社区

标题: 100人报数的入学题 答案是第几个人 我确认下 好交卷 [打印本页]

作者: 有陷阱快跑丶    时间: 2014-12-19 18:39
标题: 100人报数的入学题 答案是第几个人 我确认下 好交卷
我算出来是 92人 不知道对不对:P

:)
作者: 有陷阱快跑丶    时间: 2014-12-19 18:46
  1. public class Test10 {

  2.        
  3.         public static void main(String[] args) {
  4.                
  5.                 ArrayList<String>  al = new ArrayList<String>();
  6.                
  7.                 for(int x=1;x<=100;x++)
  8.                 {
  9.                         al.add("第"+x+"人");
  10.                        
  11.                 }
  12.                
  13.                 System.out.println(al);
  14.                
  15.                
  16.                 int num = 1;
  17.                
  18.                 while(al.size()!=1)
  19.                 {
  20.                        
  21.                         ListIterator<String> li = al.listIterator();
  22.                         while(li.hasNext())
  23.                         {
  24.                                 li.next();
  25.                                
  26.                                 if(num==14)
  27.                                 {
  28.                                         li.remove();
  29.                                         num=1;
  30.                                         continue;
  31.                                 }
  32.                                
  33.                                 num++;
  34.                         }
  35.                
  36.                 }
  37.                
  38.                
  39.                 System.out.println(al);
  40.                
  41.                
  42.                
  43.         }
  44.        
  45.        
  46.        

  47.        
  48.        
  49.        
  50. }
复制代码

作者: 裙下之臣    时间: 2014-12-19 18:55
这是约瑟夫环问题、恭喜你算对了
作者: huoxy    时间: 2014-12-19 19:07
  1. import java.util.ArrayList;

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

  7. public class Test5 {

  8.         public static void main(String[] args) {
  9.                
  10.                 int number = countLast(100,14);
  11.                
  12.                 System.out.println("The last one is:"+number);
  13.         }

  14.         private static int countLast(int total, int count) {
  15.                
  16.                 ArrayList<Integer> list = new ArrayList<Integer>();
  17.                 for(int i = 1;i<=total;i++)
  18.                 {
  19.                         list.add(i);
  20.                 }
  21.                 //System.out.println(list);
  22.                 int index = 0;
  23.                 while(list.size()!=1)
  24.                 {
  25.                         index = (index+(count-1))%list.size();
  26.                         System.out.print("删除"+list.get(index)+"\t");
  27.                         System.out.println(" size:"+list.size());
  28.                         list.remove(index);
  29.                 }
  30.                
  31.                 return list.get(0);
  32.         }

  33. }
复制代码


我的结果也是第92个,应该是正确的。
作者: 有陷阱快跑丶    时间: 2014-12-19 19:12
裙下之臣 发表于 2014-12-19 18:55
这是约瑟夫环问题、恭喜你算对了

- - 想了个半小时   :)   幸好没错   
作者: 有陷阱快跑丶    时间: 2014-12-19 19:13
huoxy 发表于 2014-12-19 19:07
我的结果也是第92个,应该是正确的。

谢谢 :lol
作者: DamonZh    时间: 2014-12-19 19:21
可以用5个或者10个人 手动测试下 然后和程序的值进行对比
作者: SpiderManZZH    时间: 2014-12-19 19:39
正确,这道题我也做过。
作者: godmmm    时间: 2014-12-19 20:03
本帖最后由 godmmm 于 2014-12-19 20:04 编辑

恭喜你对了,只操作角标也行,省略了迭代,就是容易错。
  1. import java.util.*;
  2. public class CountOff {
  3.         public static void main(String[] args) {
  4.                 countOff(14);
  5.         }
  6.         private static void countOff(int i) {
  7.                 List<String> list=new ArrayList<String>();
  8.                 int num=1;
  9.                 for(int x=1;x<=100;x++)
  10.                 {
  11.                         list.add("第"+x+"人");
  12.                 }
  13.                 while(list.size()>1)
  14.                 {
  15.                         for(int x=0;x<list.size();x++)
  16.                         {
  17.                                 if(num==14)
  18.                                 {
  19.                                         System.out.println(list.remove(x));
  20.                                         x=x-1;
  21.                                         num=1;
  22.                                         continue;
  23.                                 }
  24.                                 num++;
  25.                         }
  26.                 }
  27.                 System.out.println(list);
  28.         }
  29. }
复制代码




作者: Rain2692    时间: 2014-12-19 20:05
看看我的帖子吧。。
作者: 有陷阱快跑丶    时间: 2014-12-19 21:55
Rain2692 发表于 2014-12-19 20:05
看看我的帖子吧。。

恩恩  :P
作者: 冥夜    时间: 2014-12-19 22:49
楼主写的很好啊。。我当时写的比这个复杂做了。。用数组做的。把第几人直接作为属性保存进集合的思路真是太棒了
作者: 有陷阱快跑丶    时间: 2014-12-19 23:45
冥夜 发表于 2014-12-19 22:49
楼主写的很好啊。。我当时写的比这个复杂做了。。用数组做的。把第几人直接作为属性保存进集合的思路真是太 ...

嘻嘻   :P  你都过面试了   我还在准备呢,羡慕
作者: zw937820438    时间: 2014-12-20 00:21
学无止境啊
作者: 找寻小龙猫    时间: 2014-12-20 00:33
学习了,





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