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

来源:互联网 发布:海南网络广播 编辑:程序博客网 时间:2024/05/30 04:11

假设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 --;        }}


原创粉丝点击