猴子选大王

题目:若干个猴子围成一个圈开始报数,每当报到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.第四种方式是利用链表的方式,以后补上

你可能感兴趣的:(java,C++,c,C#,OO)