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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小小瓶盖❤ 中级黑马   /  2014-2-21 10:34  /  791 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于下面这道题我是这么做的,想问一下那位同胞有没有更好的方法??
  1. package com.itheima.exam2;

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

  4. /**
  5. * 第十题:有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。 问:最后剩下的是100人中的第几个人?
  6. *
  7. * 分析: 我们可以将所有的人的编号保存在一个集合中,然后将所有的退出来的人的编号也保存在一个集合中,用removeAll方法就可以算出留下来的人的编号了。
  8. * 怎么样计算退出来的人的编号呢?我们可以采用循环的方式,在循环中定义一个变量,用来数数用的(也就是1到14这么数),同时用一个变量记录人的编号,
  9. * 这样把每一个刚好数到14的人都添加进退出的人的编号的集合中,同时要判断集合中是否已经存在该编号,如果存在则跳过,当集合中已经有了有了87个数的时候,
  10. * 应该停止循环,因为一个人不能再一轮中数两次。
  11. *
  12. *
  13. * @author 依逸鱼忆
  14. *
  15. */
  16. public class Test10 {
  17.         public static void main(String[] args) {
  18.                 for (Integer i : getLeaveNumbers(100, 14))
  19.                         System.out.print(i + " ");
  20.         }

  21.         public static List<Integer> getLeaveNumbers(int sum, int num) {
  22.                 int newSum = sum + 1;
  23.                 // 所有人的编号的集合
  24.                 List<Integer> sums = new ArrayList<Integer>();
  25.                 for (int i = 1; i < newSum; i++)
  26.                         sums.add(i);

  27.                 // 退出的人编号的集合
  28.                 List<Integer> outs = new ArrayList<Integer>();

  29.                 // 计数器
  30.                 int count = 0;

  31.                 // 循环数数
  32.                 for (int i = 1; i < newSum; i++) {

  33.                         count++;

  34.                         // 循环判断outs集合中是否已经有了当前的i,如果有则把i自增到下一位
  35.                         while (outs.contains(i)) {
  36.                                 i++;
  37.                                 // 如果outs集合中存在100,那么就要从头开始
  38.                                 if (i == newSum)
  39.                                         i = 1;
  40.                         }

  41.                         // 每当count等于14时,那个人就是要退出的人
  42.                         if (count % 14 == 0) {
  43.                                 outs.add(i);
  44.                                 // 将计数器归0
  45.                                 count = 0;
  46.                         }

  47.                         // 每当数到100时,从头开始
  48.                         if (i == sum)
  49.                                 i = 1;

  50.                         // 当outs集合中已经有87人时,循环结束
  51.                         if (outs.size() == (sum - num + 1))
  52.                                 break;

  53.                 }
  54.                 sums.removeAll(outs);
  55.                 return sums;
  56.         }
  57. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马