黑马程序员技术交流社区
标题:
优化
[打印本页]
作者:
小小瓶盖❤
时间:
2014-2-21 10:34
标题:
优化
关于下面这道题我是这么做的,想问一下那位同胞有没有更好的方法??
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;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2