JAVA小练习

题目如下:

一群小孩手拉手围成一圈,从第一个小孩开始数数,1,2,3.某个小孩数到3的时候退出该圈.他的下一个小孩又从1开始数,下面的小孩数到3的时候又退出.数完后,会有最后一个小孩。问:最后那个小孩是圈中的第几个小孩?

第一种方法:用数组解决,代码如下:

public class Count3Exit{

 public static void main(String[] args){

  boolean[] arr = new boolean[500];

  for(int i = 0;i < arr.length;i++){

   arr[i] = true;

  }

  System.out.println("***********");

  int leftCount = arr.length;

  int Count = 0;

  int index = 0;

    

  while(leftCount > 1){

   if(arr[index] == true){

    Count++;

    //index++

    if(Count == 3){

      Count = 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);

   }

  }

 }

第二种方法:面向对象思路,双向循环链表,代码如下:

public class Count3Exit2{

 public static void main(String[] args){

  KidCircle kc = new KidCircle(500);

  int num = 0;

  Kid k = kc.first;

  while(kc.count > 1){

   num ++;

   if(num == 3){

    num = 0;

    kc.delete(k);

    }

   k = k.right;

  }

  

  System.out.println(kc.first.id);

 }

}



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();

  }

  //System.out.println(count);

 }

 void add(){

  Kid kid = new Kid();

  kid.id = count;

  if(count <= 0){

   first = kid;

   last = kid;

   kid.left = kid;

   kid.right = kid;

  }else{

   last.right = kid;

   kid.left = last;

   kid.right = first;

   first.left = kid;

   last = kid;

  }

  count ++;

 }

 void delete(Kid k){

  if(count <= 0){

   System.out.println("圈里没人...");

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

 }

}



      

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值