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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

曾权

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 曾权 初级黑马   /  2013-11-23 01:04  /  834 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. <font color="Green">/*
  2. * 有n个孩子站成一圈,从第一个孩子开始顺时针方向报数,
  3. * 报到3的人出列,下一个人继续从1报数,直到最后剩下
  4. * 一个孩子为止。问剩下第几个孩子。下面的程序以10个
  5. * 孩子为例,模拟了这个过程,请完善之(提示:报数的
  6. * 过程被与之逻辑等价的更容易操作的过程所代替)。
  7. *
  8. * 方法一(蓝桥杯给出的方法):
  9. * 数到不是出列的孩子删除并把这个孩子加到队列的最后,
  10. * 数到出列的孩子直接删除,直到只剩下最后一个孩子为止
  11. * Vector a = new Vector();
  12.                 for(int i=1; i<=10; i++)
  13.                 {
  14.                         a.add("第" + i + "个孩子");
  15.                 }
  16.                 for(;;)
  17.                 {
  18.                         if(a.size()==1) break;
  19.                         for(int k=0; k<2; k++)
  20.                                 a.add(a.remove(0));
  21.                         a.remove(0);
  22.                 }
  23.                 System.out.println(a);
  24. *
  25. * */</font>

  26. <font color="Green">//方法二:利用引用来模拟出循环链表来决解
  27. //这一个方法可以灵活变通,可以从随机一个孩子开始数</font>
  28. class Peoson{<font color="Green">//定义一个孩子类</font>
  29.         int num; <font color="Green">//孩子编号</font>
  30.         static int count=0; <font color="Green">//正在游戏中的孩子总数</font>
  31.         Peoson getNext=null;<font color="Green">//本类的引用,用来指向下一个孩子.</font>
  32.         Peoson(int num){
  33.                 count++; <font color="Green">//每创建一个孩子加1</font>
  34.                 this.num=num;
  35.         }
  36. }
  37. public class BaoshuGame {
  38.        
  39.         public static void main(String[] args) {
  40.                 Peoson p=new Peoson(1);<font color="Green"> //创建第一个孩子//</font>
  41.                 Peoson p1=p; <font color="Green">//p1表示指针,开始p1为第一个孩子</font>
  42.                 for (int i = 2; i <= 10; i++) {
  43.                         <font color="Green">//从第二个孩子开始创建,并且前一个孩子指向下一个孩子</font>
  44.                         Peoson p2=new Peoson(i);<font color="Green">//创建孩子对象</font>
  45.                         p1.getNext=p2; <font color="Green">//p1指向这个孩子</font>
  46.                         p1=p2; <font color="Green">//p1变为这个孩子(和p1指向这个孩子是不同的概念,这里实现了p1的移动)</font>
  47.                 }
  48.                 p1.getNext=p;  <font color="Green">//到这为止,p1为最后一个孩子,并指向第一个孩子,循环链表已经形成</font>
  49.                
  50.                 <font color="Green">//下面开始报数
  51.                 /*
  52.                  * 实现过程是:报到的孩子出列,即这个孩子的前一个孩子指向这个孩子的下一个孩子,让
  53.                  * 这个孩子成为野孩子
  54.                  * */</font>
  55.                 while(Peoson.count!=1){
  56.                         Peoson p2=null;
  57.                         for (int i = 1; i < 3; i++) {
  58.                                 p2=p;
  59.                                 p=p.getNext;
  60.                         }
  61.                         <font color="Green">//循环两次后p为第三个孩子了,即要出列的孩子,p2为出列孩子的前一个孩子</font>
  62.                         p2.getNext=p.getNext;<font color="Green">//出列孩子的前一个孩子指向出列孩子的下一个孩子</font>
  63.                         p=p.getNext;<font color="Green">//从出列孩子的下一个孩子开始</font>
  64.                         Peoson.count--;<font color="Green">//孩子个数减1</font>
  65.                 }
  66.                 System.out.println(p.num);<font color="Green">//打印最后一个孩子的编号,游戏结束</font>
  67.         }
  68. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
To + 1 新人鼓励

查看全部评分

0 个回复

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