所有人围成一个圈,数到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
    评论
假设有n个人围一圈,顺序排号。按照题目规则,每报到3的人就会退出圈子。我们可以采用模拟的方法来求解最后留下的人的编号。 首先,我们定义一个长度为n的数组,用来表示每个人是否还在圈子中。数组中的元素初始值为1,表示所有人都在圈子中。然后,我们设置一个变量count,表示当前报数的数字,初始值为1。接着,我们从第一个人开始,依次报数并判断是否需要退出圈子,直到圈子中只剩下一个人。 每当一个人报数时,我们将count加1,然后判断count的值是否为3。如果count等于3,则当前这个人需要退出圈子,将他的位置上的数组元素改为0,表示他已经退出圈子。然后,将count重置为1,继续报数。直到圈子中只剩下一个人,这个人的编号就是最后留下的人的编号。 具体的实现过程可以参考下面的伪代码: ``` // n:总人数 int n = 10; // 初始化数组,表示所有人都在圈子中 int[] circle = new int[n]; for (int i = 0; i < n; i++) { circle[i] = 1; } // count:当前报数的数字 int count = 1; // 当圈子中还剩下多于1个人时,继续报数 int remaining = n; while (remaining > 1) { // 从第一个人开始报数 for (int i = 0; i < n; i++) { if (circle[i] == 1) { // 如果这个人还在圈子中 if (count == 3) { // 如果这个人需要退出圈子 circle[i] = 0; // 将他的位置上的数组元素改为0 remaining--; // 圈子中的人数减1 count = 1; // 重置计数器 if (remaining == 1) { // 如果圈子中只剩下一个人,返回这个人的编号 for (int j = 0; j < n; j++) { if (circle[j] == 1) { return j + 1; } } } } else { count++; // 继续报数 } } } } ``` 假设总人数n为10,按照上述伪代码运行程序,最后留下的人的编号是4。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值