所有人围成一个圈,数到3的人就退出,问最后留下的那个人的位置在那里

第一种方法

public class Count3Quit{
public static void main(String []args){
//定义一个数组用来当做500个人.并且初始化为true表示都在圈内
boolean arr[] =new boolean[500];
for(int i=0; i<arr.length; i++){
arr[i]=true;
}
//定义一个总人数
int count=arr.length;
//定义一个索引位置,表示当前在那个位置
int index=0;
//计数器,数到3退出
int countNum=0;
//如果只剩下最后一个人就退出循环
while(count>1){

if(arr[index]==true){ //如果当前的这个人在圈内就开始数数

countNum++;

if(countNum==3){ 

countNum=0; // 如果数到3了就要把计数器归0

arr[index]=false; //表示这个人已经退出

count--; //总人数减去一个


}

index++;

if(index==arr.length){
index=0;
}
}
//找到最后一个在圈子内的人的下标位置
for(int i=0 ;i<arr.length; i++){
if(arr[i]==true){
System.out.println("最后剩下的一个人在第"+(i+1)+"个位置");
}
}
}
}

第二种方法(面向对象的思想)

public class Count3Quit2 {
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.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, 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 delete(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 --;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值