关于下面这道题我是这么做的,想问一下那位同胞有没有更好的方法??- package com.itheima.exam2;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 第十题:有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。 问:最后剩下的是100人中的第几个人?
- *
- * 分析: 我们可以将所有的人的编号保存在一个集合中,然后将所有的退出来的人的编号也保存在一个集合中,用removeAll方法就可以算出留下来的人的编号了。
- * 怎么样计算退出来的人的编号呢?我们可以采用循环的方式,在循环中定义一个变量,用来数数用的(也就是1到14这么数),同时用一个变量记录人的编号,
- * 这样把每一个刚好数到14的人都添加进退出的人的编号的集合中,同时要判断集合中是否已经存在该编号,如果存在则跳过,当集合中已经有了有了87个数的时候,
- * 应该停止循环,因为一个人不能再一轮中数两次。
- *
- *
- * @author 依逸鱼忆
- *
- */
- public class Test10 {
- public static void main(String[] args) {
- for (Integer i : getLeaveNumbers(100, 14))
- System.out.print(i + " ");
- }
- public static List<Integer> getLeaveNumbers(int sum, int num) {
- int newSum = sum + 1;
- // 所有人的编号的集合
- List<Integer> sums = new ArrayList<Integer>();
- for (int i = 1; i < newSum; i++)
- sums.add(i);
- // 退出的人编号的集合
- List<Integer> outs = new ArrayList<Integer>();
- // 计数器
- int count = 0;
- // 循环数数
- for (int i = 1; i < newSum; i++) {
- count++;
- // 循环判断outs集合中是否已经有了当前的i,如果有则把i自增到下一位
- while (outs.contains(i)) {
- i++;
- // 如果outs集合中存在100,那么就要从头开始
- if (i == newSum)
- i = 1;
- }
- // 每当count等于14时,那个人就是要退出的人
- if (count % 14 == 0) {
- outs.add(i);
- // 将计数器归0
- count = 0;
- }
- // 每当数到100时,从头开始
- if (i == sum)
- i = 1;
- // 当outs集合中已经有87人时,循环结束
- if (outs.size() == (sum - num + 1))
- break;
- }
- sums.removeAll(outs);
- return sums;
- }
- }
复制代码
|