数三退一(利用java数组和对象解决问题)(转)

本文探讨了500个孩子手拉手围成一圈,并按数三淘汰规则找出最后留下的孩子的编号问题。通过两种不同的实现方式——传统数组方法和面向对象方法,展示了具体的程序代码及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设500个小孩手拉着手围着一圈,数三就退出圈子,最后留在圈内的小孩是第几号?

有一种是用很传统的算法,用数组来编。
程序代码如下:

public class CountThreeDel1 {
    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 countMum = 0;
       int index = 0;
  
       while(leftCount>1) {
           if(arr[index]==true) {
              countMum ++;
              if(countMum == 3) {
                  countMum = 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);
               int d = i + 1;
              System.out.println("所以剩下的是第" + d + "号!");
          }
      }
    }
}


采用面向对象的思路:
面向对象的思路,首先考虑这个问题域中有那些类,类里面有哪些属性,哪些方法
题中有一个小孩和由一个小孩围成的圈。
程序代码如下:

public class CountThreeDel2 {
      public static void main(String[] args) {
              KidCircle kc = new KidCircle(500);
               int countNum = 0;
              Kid k = kc.first;
              while(kc.count > 1) {
                   countNum ++;
                   if(countNum == 3){
                         countNum = 0;
                           kc.delet(k);  
                    }
                    k = k.right;
               }
               System.out.print("剩下的小孩编号是:");
               System.out.println(kc.first.id+1);
       } 
}
class Kid {
      int id;
      Kid left;
      Kid right;
}
class KidCircle{
       int count = 0;
       Kid first;
       Kid last;

        KidCircle(int n ) {
             for(int i=0;i<n;i++) {
                    add();  
             } 
        }

        void add() {
              Kid k = new Kid();
             k.id = count;
              if(count <= 0) {
                    first = k;
                    last = k;
                    k.left = k;
                    k.right = k;
              } 
              else {
                      last.right = k;
                       k.left = last;
                      k.right = first;
                      first.left = k;
                      last = k; 
              }
              count ++;  
        }

        void delet(Kid k) {
              if(count <= 0) {
                   return;
              }
              else if(count == 1) {
                        first = last = null;
              }
              else {
                       k.left.right = k.right;
                       k.right.left = k.left;
   
                       if (k == first) {
                              first = k.right; 
                       }
                       else if(k ==last) {
                              last = k.left;
                       }
               }
              count --;
        }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值