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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋耀冬 中级黑马   /  2013-3-19 13:57  /  2027 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有500个人手拉手站成一圈,从一个人开始数1,2,3。数到3的人退出圈外,下个人继续数1,2,3
问最后剩下的人是原来的 第几个人,下面代码是有一般做法解题。
用面向对象的思路应该怎么做

class Count3Quit
{
        public static void main(String[] args)
        {
                boolean[] arr = new boolean[500];
                for (int i=0; i<arr.length; i++)
                {
                        arr[i] = true;
                }

                int leftCount = arr.length;
                int countNum = 0;
                int index = 0;

                while (leftCount > 1)
                {
                        if (arr[index] == true)
                        {
                                countNum ++;
                                if (countNum == 3)
                                {
                                        countNum = 0;
                                        arr[index] = false;
                                        leftCount --;
                                }
                        }

                        index ++;

                        if (index == arr.length)
                        {
                                index = 0;
                        }
                }

               

                for (int i=0; i<arr.length; i++)
                {
                        if (arr[i] == true)
                        {
                                System.out.println("最后一个人是第"+(i+1)+"个人");
                        }
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
思路:
1、把这个游戏看成一个对象。
2、该对象身上有什么数据(成员变量)
3、该对象什么功能。
4、代码不会写
回复 使用道具 举报
请参考。我也想了很久当初。后来看着视频一步步做出来。
  1. package com.ivo;

  2. // 1.通过面向对象来实现数3退1
  3. // 实现的是具有回环的双向链表
  4. //说明:以5个小孩为例,在while处设置断点,进行debug,观察countNum、当前小孩k(id号) 、当前小孩圈(first和last的id号)的变化情况,会对程序的执行过程有更清醒的认识。

  5. public class Test {

  6.         public static void main(String[] args) {
  7.                 // 创建一个有500个小孩的圈
  8.                 KidCircle kc = new KidCircle(500);
  9.                 // k用来记录当前指向的那个小孩,刚开始时设置圈首的小孩为k
  10.                 Kid k = kc.first;
  11.                 // countNume用来记录小孩数的数(1、2、3)
  12.                 int countNum = 0;
  13.                 // while成立则说明圈内还不止一个小孩,需要继续往下数数
  14.                 while (kc.count > 1) {
  15.                         countNum++;
  16.                         if (countNum == 3) {
  17.                                 // 当前小孩数的数是3 的话,将数数标志清0,该小孩退出
  18.                                 countNum = 0;
  19.                                 kc.delete(k);
  20.                         }
  21.                         // 移动k标志到下一个小孩头上
  22.                         k = k.right;
  23.                 }
  24.                 // while不成立的时候,说明此时该圈中就剩下一个小孩了,将其id号输出即可
  25.                 System.out.println("最后一个小孩的编号是:" + kc.first.id);
  26.         }
  27. }

  28. class Kid {
  29.         // 小孩编号
  30.         int id;
  31.         // 小孩的左手边也是一个小孩
  32.         Kid left;
  33.         // 小孩的右手边也是一个小孩
  34.         Kid right;
  35. }

  36. class KidCircle {
  37.         // count用来记录圈中小孩数
  38.         int count = 0;
  39.         // first用来记录当前圈的第一个小孩
  40.         Kid first;
  41.         // last用来记录当前圈的最后一个小孩
  42.         Kid last;

  43.         // 小孩圈的构造方法,可以创建n个小孩的圈
  44.         KidCircle(int n) {
  45.                 for (int i = 0; i < n; i++) {
  46.                         add();
  47.                 }
  48.         }

  49.         // 往圈中增加小孩
  50.         public void add() {
  51.                 Kid k = new Kid();
  52.                 // 当前创建的小孩的编号就是小孩圈的记录号
  53.                 k.id = this.count;

  54.                 if (count <= 0) {
  55.                         // 此时还没有小孩
  56.                         // 小孩圈的第一个和最后一个小孩都是k
  57.                         // 小孩k的左手边和右手边的小孩都是他自己
  58.                         this.first = k;
  59.                         this.last = k;
  60.                         k.left = k;
  61.                         k.right = k;
  62.                 } else {
  63.                         // 把这个小孩k插入到圈的末尾
  64.                         // 当前圈的第一个小孩的左手牵了k
  65.                         this.first.left = k;
  66.                         // 当前圈的最后一个小孩的右手牵了k
  67.                         this.last.right = k;
  68.                         // k的左手牵的是当前圈的最后一个小孩
  69.                         k.left = this.last;
  70.                         // k的右手牵的是当前圈的第一个小孩
  71.                         k.right = this.first;
  72.                         // k变成了圈的最后一个小孩
  73.                         this.last = k;
  74.                 }
  75.                 // 当前圈的小孩数增1
  76.                 this.count++;
  77.         }

  78.         // 把圈中的k小孩删掉
  79.         public void delete(Kid k) {
  80.                 if (this.count == 0) {
  81.                         // 已经没有小孩了
  82.                         System.out.println("There is no kid!");
  83.                 } else if (this.count == 1) {
  84.                         // 就最后一个小孩了,将圈的首尾设置为null,圈就不存在了
  85.                         this.first = this.last = null;
  86.                 } else {
  87.                         // k左边小孩的右手牵了k右边的小孩
  88.                         k.left.right = k.right;
  89.                         // k右边小孩的左手牵了k左边的小孩
  90.                         k.right.left = k.left;

  91.                         // 假如删除的k是圈的第一个小孩
  92.                         if (k == this.first) {
  93.                                 // k的右边的小孩就变成了第一个小孩
  94.                                 this.first = k.right;
  95.                                 // 假如删除的k是圈的最后一个小孩
  96.                         } else if (k == this.last) {
  97.                                 // k的左边的小孩就变成了最后一个小孩
  98.                                 this.last = k.left;
  99.                         }
  100.                         // 圈中小孩数目减1
  101.                         this.count--;
  102.                 }
  103.         }
  104. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
记得及时处理帖子哦,继续追问,或将分类改成【已解决】~
回复 使用道具 举报
0.0.0.0.0..0.{:soso_e144:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马