500个人围成一圈,从第一个人开始数数,数到第三个人,第三个人就退出,然后从第四个人开始继续数到3就退出一人,最后只城下一个人的时候就输出那个人的下标!?????????
class Kid{
int id;
Kid right;
Kid left;
}
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{
k.right=first;
first.left=k;
k.left=last;
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--;
} }
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){
kc.Delete(k);
countNum=0;
}
k=k.right;
}
System.out.println(k.count);
}
}
class Kid{
int id;
Kid right;
Kid left;
}
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{
k.right=first;
first.left=k;
k.left=last;
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--;
} }
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){
kc.Delete(k);
countNum=0;
}
k=k.right;
}
System.out.println(k.count);
}
}
我当时是用队列来处理的
首先把所有元素都入队,然后从队首去取元素,每次取一个并且记数,当记数是1和2的时候把取出的元素又入队尾,当记数是3的时候就把取出的元素扔掉。
当然,每次取的时候都查一下队列里面还有没有元素,如果没有的话,就输出它的号码我当时是用Integer 作为元素的
last.right=k;
k.left=last;
k.right=first;
first.left=k;
last=k;