题目:若干个猴子围成一个圈开始报数,每当报到m(例如3)时,这个猴子就自动离开,然后下一位重新从1开始报数,最后那只猴子就是大王。
1.一种简单的方式。这种方式比较慢
2.另外一种方式是算出每次出圈猴子的位置
3.第三种方式就比较厉害了,利用数学的方式直接算出最后那只猴子的位置
4.第四种方式是利用链表的方式,以后补上
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.第四种方式是利用链表的方式,以后补上