1. 程式人生 > >《黑馬程式設計師》 java演算法練習題

《黑馬程式設計師》 java演算法練習題

public class Demo {
	/*
	 * 有100個人圍成一個圈,從1開始報數,報到14的這個人就要退出。
	 * 然後其他人重新開始,從1報數,到14退出。
	 * 問:最後剩下的是100人中的第幾個人?
	 */
	public static void main(String[] args) {
		//建立一個集合將要數數的100個新增
		ArrayList<Integer> alPersons=new ArrayList<Integer>();
		for(int i=1;i<=100;i++){
			alPersons.add(i);
		}
		//建立一個集合獲取所有退出的人
		ArrayList<Integer> outPersons=getOutPerson();
		//從所有人的集合中將退出人的集合刪除
		//即把所有的退出的人給刪除掉了
		//集合中所留下的就是沒有刪除的人
		alPersons.removeAll(outPersons);
		//對集合進行迭代
		for(Iterator<Integer> itea=alPersons.iterator();itea.hasNext();){
			System.out.print(itea.next()+" ");
		}
	}
	
	public static ArrayList<Integer> getOutPerson(){
		//建立一個臨時的集合中於將數到14的這個人新增到集合中
		ArrayList<Integer> tempList=new ArrayList<Integer>();
		//記錄每個人數到的數
		int count=0;
		for(int i=1;i<=100;i++){
			count++; //迴圈一次,記錄一次別人數到的數
			while(tempList.contains(i)){
				i++;  //如果集合中已經存在了這個數字就往下一個進行判斷
				//直到集合中不包含這個數時迴圈退出
				if(i==101){
					//如果判斷到了第100個人就從第一個人重新開始判斷
					i=1;
				}
			}
			if(count%14==0){
				//如果計數器記錄到了14
				//就把數到第14的這個人新增到集合中
				tempList.add(i);
				count=0;  //把計數器置為0從1重新開始數
			}
			if(i==100){
				//如果是第100個人在數
				//就從第1個重新開始數
				i=1;
			}
			if(tempList.size()>86){
				//如果集合的長度是86則儲存的資料其實是儲存了87個
				//角標是從0開始的。
				break;  //迴圈結束
			}
		}
		return tempList;
	}

}