猴子选大王

题目:若干个猴子围成一个圈开始报数,每当报到m(例如3)时,这个猴子就自动离开,然后下一位重新从1开始报数,最后那只猴子就是大王。

1.一种简单的方式。这种方式比较慢

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


public class OutQueue {
public void outQ(List<String> persons ,int num){
int count=0;
while(!persons.isEmpty()){
Iterator<String> it = persons.iterator();
while(it.hasNext()){
String name = it.next();
count++;
if(count==num){
System.out.println(name + " is out queue");
it.remove();
count = 0;
}
}
}
}

/**
* @param args
*/
public static void main(String[] args) {
List<String> persons = new ArrayList<String>();
persons.add("a");
persons.add("b");
persons.add("c");
persons.add("d");
persons.add("e");
persons.add("f");

OutQueue oo = new OutQueue();
oo.outQ(persons, 3);
}
}


2.另外一种方式是算出每次出圈猴子的位置

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


public class OutQueue {
public int getPosition(List<String> persons, int num){
if(persons.size() == 0){
return -1;
}

int position = num % persons.size();
if(position == 0){
position = persons.size();
}
return position;
}

public void outQueue(List<String> persons, int num){
int count = 0;
while(!persons.isEmpty()){
int position = this.getPosition(persons, num);
Iterator<String> it = persons.iterator();
while(it.hasNext()){
String name = it.next();
count ++;
if(count == position){
System.out.println(name + " is out queue");
it.remove();
count = 0;
position = this.getPosition(persons, num);
}
}
}
}

/**
* @param args
*/
public static void main(String[] args) {
List<String> persons = new ArrayList<String>();
persons.add("a");
persons.add("b");
persons.add("c");
persons.add("d");
persons.add("e");
persons.add("f");

OutQueue oo = new OutQueue();
oo.outQueue(persons, 3);
}
}


3.第三种方式就比较厉害了,利用数学的方式直接算出最后那只猴子的位置

public int getQue(int n,int m){
int r = 0;
for(int i=2;i<=n;i++)
r = (r+m)%i;
return r+1;
}


4.第四种方式是利用链表的方式,以后补上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值