提供第二种思路:
题目:500个小孩手拉手围成一圈,每个小孩有一编号,数数,当数到第三个时,将该小孩删除,求最后剩下的那个小孩是这500个小孩中的第几个。
面向对象编程,首先分析,有多少个对象?
两个。
1.小孩
成员特点:
a.需要有编号
b.圆圈,需要有左孩子,left和右孩子right
2.小孩围成的圈
成员特点:
a.每个成员的编号
b.圆圈围成的第一个孩子first
c.圆圈围成的最后一个孩子last
有哪些函数:
A.构造函数(传入一个参数n,即生成多大的孩子圈)
B.添加孩子函数void add()
注意的地方:
1.要判断添加的是不是圆圈内的第一个孩子
2.添加时,k 与 first/last/ left/right的关系
C.删除孩子函数void delete(Kid k) 传入要删除的孩子
注意的地方:
1.当圆圈内一个人都没有----直接返回
2.当圆圈内只有唯一一个人----first/last都置为空
3.其他情况
1.删的是第一个孩子
2.删的是第二个孩子
main函数
1.生成一个kidcircle对象kc
2.创建kid,将其指定为kc的first
3.创建一个数数的变量countNum,先初始化为0,然后数数,数到3,将其重新置为0,然后调用delete()函数
具体代码实现:
public class Count3Quit4{
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 --;
}
}