普通的解决方式:
public class CountThreeQuit {
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 countNumber = 0;
int index = 0;
while (leftCount > 1) {
if (arr[index] == true) {
countNumber++;
if (countNumber == 3) {
countNumber = 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 Count3Quit {
public static void main(String[] args) {
KidCircle kc = new KidCircle(500);
int countNum = 0;
Kid currentKid = kc.getFirst();
while (kc.getCount() > 1) {
countNum++;
if (countNum == 3) {
countNum = 0;
kc.delete(currentKid);
}
currentKid = currentKid.getRight();
}
System.out.println("当前圈中所剩的小孩的编号是:" + kc.getFirst().getId());
}
}
class Kid {
private static int nextId = 0;
private int id = 0;
private Kid left = null;
private Kid right = null;
public Kid() {
this.id = nextId;
nextId++;
}
public int getId() {
return id;
}
public Kid getLeft() {
return left;
}
public void setLeft(Kid left) {
this.left = left;
}
public Kid getRight() {
return right;
}
public void setRight(Kid right) {
this.right = right;
}
}
class KidCircle {
private int count = 0;
private Kid first = null;
private Kid last = null;
public KidCircle(int n) {
for (int i = 0; i < n; i++) {
add();
}
}
public int getCount() {
return count;
}
public Kid getFirst() {
return first;
}
public Kid getLast() {
return last;
}
private void add() {
Kid kid = new Kid();
if (count <= 0) {
first = kid;
last = kid;
kid.setLeft(kid);
kid.setRight(kid);
} else {
last.setRight(kid);
first.setLeft(kid);
kid.setLeft(last);
kid.setRight(first);
last = kid;
}
count++;
}
public void delete(Kid kid) {
if (count <= 0) {
System.out.println("当前圈中已经没有小孩,无法实施删除指令!");
return;
} else if (count == 1) {
first = last = null;
} else {
kid.getLeft().setRight(kid.getRight());
kid.getRight().setLeft(kid.getLeft());
if (kid == first) {
first = kid.getRight();
} else if (kid == last) {
last = kid.getLeft();
}
}
count--;
}
}
用两个数组模拟:
一个数组记录当前元素右边的元素的索引位置arrRight
一个数组记录当前元素左边的元素的索引位置arrLeft
public class ArrayCount3Quit {
public static void main(String[] args) {
int arrLen = 500;
int[] arrRight = new int[arrLen];
int[] arrLeft = new int[arrLen];
for (int i = 0; i < arrLen; i++) {
if (i == arrLen - 1) {
arrRight[i] = 0;
} else {
arrRight[i] = i + 1;
}
if (i == 0) {
arrLeft[i] = arrLen - 1;
} else {
arrLeft[i] = i - 1;
}
}
for (int i = 0; i < arrLeft.length; i++) {
System.out.println("arrLeft " + i + ":" + arrLeft[i]);
}
for (int i = 0; i < arrRight.length; i++) {
System.out.println("arrRight " + i + ":" + arrRight[i]);
}
int currentArrayLength = arrLen;
int countNumber = 0;
int currentIndex = 0;
int left = 0;
int right = 0;
while (currentArrayLength > 1) {
countNumber++;
if (countNumber == 3) {
countNumber = 0;
currentArrayLength--;
left = arrLeft[currentIndex];
right = arrRight[currentIndex];
arrRight[left] = right;
arrLeft[right] = left;
}
currentIndex = arrRight[currentIndex];
}
System.out.println(currentIndex);
}
}