java问题:500个孩子围成圈,从第一个开始报数,逢3退出,然后从下一个孩子继续开始报数,直到只剩下一个

2025-05-22 02:40:14
推荐回答(3个)
回答(1):

逢3退出,我的理解是数字中带3的, 3 13 23 30-39这些都是.
看了一下约瑟夫环,说的是 3的倍数.所以做了,两个判断方法.
isMod3
isMeet3

从实现上来说,用list这样的集合方便一些.数组不具有删除相应元素的能力,只能写方法来处理.
fun1 - list
fun2 - 用一个自定义对象数组
fun3 - 用int[]数组来处理.

你看一下吧.希望对你有帮助.
---------------------------------------------------------------------------------------------------------------------

import java.util.ArrayList;
import java.util.List;

public class Test1 {

public static void main(String[] args) throws Exception {
new Test1().fun1();
new Test1().fun2();
new Test1().fun3();
}

public void fun1() {
List listUser = new ArrayList();
for (int i = 1; i <= 500; i++) {
listUser.add(i);
}
int index = 0;
int count = 1;
while (listUser.size() > 1) {
// if (isMod3(count++)) {
if (isMeet3(count++)) {
listUser.remove(index);
index--;
}
if (listUser.size() == ++index) {
index = 0;
}
}
System.out.println(listUser.get(0));
}

// 例3,6,9
public boolean isMod3(int x) {
return x % 3 == 0;
}

// 例3,13,23,30,31....
public boolean isMeet3(int x) {
boolean result = false;
while (x > 0) {
if (x % 10 == 3) {
result = true;
break;
}
x = x / 10;
}
return result;
}

public void fun2() {
User[] users = new User[500];
for (int i = 0; i < users.length; i++) {
users[i] = new User();
users[i].no = i + 1;
}
int index = 0;
int meet = 1;
int count = 0;
while (users.length - count > 1) {
if (index == users.length) {
index = 0;
}
if (users[index].isDelete) {
index++;
continue;
}
if (isMeet3(meet)) {
count++;
users[index].isDelete = true;
}
meet++;
index++;
}

for (int i = 0; i < users.length; i++) {
if (!users[i].isDelete) {
System.out.println(users[i].no);
}
}
}

class User {
int no = 0;
boolean isDelete = false;
}

public void fun3() {
int[] users = new int[500];
for (int i = 0; i < users.length; i++) {
users[i] = i + 1;
}

int index = 0;
int count = 1;

while (users.length > 1) {
if (isMeet3(count++)) {
users = arrayRemoveIndex(users, index);
index--;
}
if (users.length == ++index) {
index = 0;
}
}
System.out.println(users[0]);
}

public int[] arrayRemoveIndex(int[] array, int index) {
int[] newArray = new int[array.length - 1];
int arrayIndex = 0;
for (int i = 0; i < array.length; i++) {
if (i == index) {
continue;
}
newArray[arrayIndex++] = array[i];
}
return newArray;
}
}

回答(2):

用栈吧,数组不能把退出的孩子删除

回答(3):

这个经典编程问题。每年几十万人都写这个题
搜索“约瑟夫环”,答案有几万套。不用人替你再写了。