劍指offer之孩子們的遊戲(圓圈中最後剩下的數)_java

題目:孩子們的遊戲(圓圈中最後剩下的數)

題目描述
每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。HF作爲牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的:首先,讓小朋友們圍成一個大圈。然後,他隨機指定一個數m,讓編號爲0的小朋友開始報數。每次喊到m-1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮物,並且不再回到圈中,從他的下一個小朋友開始,繼續0…m-1報數…這樣下去…直到剩下最後一個小朋友,可以不用表演,並且拿到牛客名貴的“名偵探柯南”典藏版(名額有限哦!!_)。請你試着想下,哪個小朋友會得到這份禮品呢?(注:小朋友的編號是從0到n-1)

解題思路:
用數組來模擬環,當人只剩下一個時,返回此時的下標

代碼實現:

public class Solution {
    public int LastRemaining_Solution(int n, int m) {
        //代碼的魯棒性
		if(n<1 || m<1) {
			return -1;
		}
        //定義一個flag標誌,標誌走過的位置
		boolean [] flag=new boolean[n];
		int index=-1;
        //走過的步數,當step==m時,刪除這個元素
		int step=0;
        //總共的人數,當只剩下一個人時返回下標index
		int count=n;
		while(count>0) {
			index++;
			if(index==n) {//當走到數組的最後一個位置,回到數組的頭部
				index=0;
			}
			if(flag[index]) {//如果此位置的人已經被刪除,continue
				continue;
			}
			step++;
			if(step==m) {//找到要刪除的元素
				flag[index]=true;
				step=0;
				count--;
			}
		}
		return index;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章