天天看點

61.出圈遊戲

程式設計題目:

61.50個人圍成一圈數到三和三的倍數時出圈,問剩下的人是誰?在原來的位置是多少?

示例代碼:

package program.calculation.exercise61;

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

/**
 * 61.50個人圍成一圈數到三和三的倍數時出圈,問剩下的人是誰?在原來的位置是多少?
 * 
 * 說明:由于每次去掉元素以後,元素的個數會少一個,是以下一個3的倍數其實隻需要走兩步,
 * 在為其下标指派的時候,需要減一,保持每次去掉的元素報數都是3的倍數。
 * 如果使用從0開始的下标開始計算,那麼初始化的時候應該使用-1(對應後來的index--),
 * 這樣就可以模拟元素已經減少一個了(令起始數字為123,初始化為-1,下一個去掉的數字就是3).
 * 如果下标為0的被删除,下标為1的還沒有被删除,這時候下标為1的數字的下标自動為0。
 */

public class CircleGame {
	public static void main(String[] args) {
		
		int num = outCycle(6, 3);
		System.out.println("該數字原來的位置是:"+num); 
		
	}

	//出圈
	private static int outCycle(int n, int m) {  
		
		int index = -1;  //定義下标,模拟已經去掉一個元素,是以從-1開始
        List<Integer> list = new ArrayList<Integer>();//建立集合對象  
        
        for (int i=1;i<=n;i++){  //添加資料元素  
        	list.add(i);    
        }
        
	    while (list.size() > 1) { //一直循環去除資料,直到隻剩下一個元素 
            index = (index+m) % list.size();//得到應該出局的下标  
            list.remove(index--);  //去除元素  
        }    
        return list.get(0);//傳回它的值  
    }    

}
           

結果顯示:

61.出圈遊戲