黑马程序员技术交流社区
标题:
这题有意思
[打印本页]
作者:
我本善良。
时间:
2016-7-20 21:48
标题:
这题有意思
10、有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
作者:
崔小旭
时间:
2016-7-21 11:15
本帖最后由 崔小旭 于 2016-7-21 13:29 编辑
package com.heima;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> al = new ArrayList<Integer>();//新建一个集合,用于存储这100个人
for(int i = 1; i<=100; i++){//给集合添加元素
//添加到集合
al.add(i);
ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储每次退出的那个人
newAl = getQuit();//通过调用getQuit()方法,给集合添加元素
al.removeAll(newAl);//所有人的集合减去退出的集合,就获得最后剩下没有退出的那13个人
}
for(Iterator<Integer> it = al.iterator(); it.hasNext();){//迭代取出集合的元素
System.out.print(it.next()+" ");//打印集合的元素
}
}
private static ArrayList<Integer> getQuit() {//创建一个方法,用于获取每次退出的那个人的角标
ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储退出的角标
int count = 0;//定义一个计数器,记录数数的值
//因为是一个圆圈,假定把这个圆圈拉直,把N个这样的直线连起来,就相当于永远在圆圈转圈。
for(int i = 1; i<101; i++){//因为有100人,定义一个循环次数为100的循环,i为每个人的角标
count++;//记录索引值
while(newAl.contains(i)){//判断集合是否已经添加了i
i++;//如果集合中已有那个元素,就往后加一个,再判断,直到集合中没有那个元素结束
if(i==101){//如果是第100个人的话,就从1开始
i = 1;
}
}
if(count%14==0){//如果计数器数到14,就将i添加到集合
newAl.add(i);//把这个元素加到集合去
count = 0;//把计数器置0;重新计数
}
if(i==100){//当数到第100个人的时候
i=1;//把索引置为1,1开始接着数。
}
if(newAl.size()>86)//循环终止条件:当圈子中剩余13个元素,也就是集合里面已经添加了87个就退出循环
break;//退出循环
}
return newAl;//
}
}
作者:
新晋猿工
时间:
2016-7-21 12:28
上面这代码乱的一批
作者:
崔小旭
时间:
2016-7-21 13:28
package com.heima;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> al = new ArrayList<Integer>();//新建一个集合,用于存储这100个人
for(int i = 1; i<=100; i++){//给集合添加元素
//添加到集合
al.add(i);
ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储每次退出的那个人
newAl = getQuit();//通过调用getQuit()方法,给集合添加元素
al.removeAll(newAl);//所有人的集合减去退出的集合,就获得最后剩下没有退出的那13个人
}
for(Iterator<Integer> it = al.iterator(); it.hasNext();){//迭代取出集合的元素
System.out.print(it.next()+" ");//打印集合的元素
}
}
private static ArrayList<Integer> getQuit() {//创建一个方法,用于获取每次退出的那个人的角标
ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储退出的角标
int count = 0;//定义一个计数器,记录数数的值
//因为是一个圆圈,假定把这个圆圈拉直,把N个这样的直线连起来,就相当于永远在圆圈转圈。
for(int i = 1; i<101; i++){//因为有100人,定义一个循环次数为100的循环,i为每个人的角标
count++;//记录索引值
while(newAl.contains(i)){//判断集合是否已经添加了i
i++;//如果集合中已有那个元素,就往后加一个,再判断,直到集合中没有那个元素结束
if(i==101){//如果是第100个人的话,就从1开始
i = 1;
}
}
if(count%14==0){//如果计数器数到14,就将i添加到集合
newAl.add(i);//把这个元素加到集合去
count = 0;//把计数器置0;重新计数
}
if(i==100){//当数到第100个人的时候
i=1;//把索引置为1,1开始接着数。
}
if(newAl.size()>86)//循环终止条件:当圈子中剩余13个元素,也就是集合里面已经添加了87个就退出循环
break;//退出循环
}
return newAl;//
}
}
作者:
新晋猿工
时间:
2016-7-21 14:51
讲道理 上面最后得到的应该是个13个元素的吧,而题目要的是要个元素而已,所以是不对的
作者:
新晋猿工
时间:
2016-7-21 14:53
第2个人
作者:
崔小旭
时间:
2016-7-26 16:35
我只能说你出门不带脑子,仔细想好了在来说吧
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2