黑马程序员技术交流社区
标题:
分享自己写的关于报数退出的java解决方法
[打印本页]
作者:
chslzj
时间:
2013-7-15 22:48
标题:
分享自己写的关于报数退出的java解决方法
本帖最后由 chslzj 于 2013-7-15 23:10 编辑
忘记放在代码块里面了
package com.itheima;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
/**
* 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。最后得到最后剩下的是100人中的那个人
* @author Administrator
*
*/
public class Test10 {
//这里设置报到退出的数字
private static Integer number=14;
private static List<Integer> list1=new ArrayList<Integer>();
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
//初始化队列
//这里是100人,可以改其他数字,例如80人,就改成i<=80
for(int i=1;i<=100;i++)
list.add(i);
//第二个参数是第几个人开始报数字,最后一个参数是已经有几个人退出,开始调用写0.
System.out.println("第"+findTheNumber(list,0,0)+"号留到了最后");
}
//使用递归算法
public static Integer findTheNumber(List<Integer> list,int begin,int index){
for(int i=1;i<=number;i++)
System.out.println("第"+list.get((begin+i-1)%list.size())+"号喊道"+i);
int out=(begin+number-1)%list.size();
list1.add(list.get(out));
//将喊14的清除
System.out.println("第"+list.remove(out)+"号喊道"+number+",退出");
System.out.println("共有"+(++index)+"退出");
//列出已经退出的人
myToString(list1);
//防止out是最后一个,清除后越界,所以使用out%list.size()
System.out.println("下面从第"+list.get(out%list.size())+"号开始");
if(list.size()!=1)
//递归调用
findTheNumber(list, out%list.size(),index);
return list.get(0);
}
public static void myToString(List<Integer> list)
{
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("{");
for(Integer i:list)
stringBuffer.append(i+",");
stringBuffer.deleteCharAt(stringBuffer.length()-1);
stringBuffer.append("}");
System.out.println(stringBuffer.toString());
}
}
复制代码
作者:
许庭洲
时间:
2013-7-18 06:16
值得学习ing!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2