劍指offer 孩子們的遊戲

2021-09-29 14:21:30 字數 1966 閱讀 1816

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

如果沒有小朋友,請返回-1

簡化的約瑟夫環問題。

思路一:使用陣列模擬遊戲

採用標記陣列的方法,用乙個陣列標記所有小朋友的狀態。每次數了m個小朋友以後就標記乙個小朋友。這樣迴圈知道標記了n個小朋友。返回最後乙個標記的小朋友的序號。

這種方法每次需要訪問陣列中每個元素,代價較大。

思路二:使用list模擬鍊錶

使用list存每個小朋友的序號。直接根據取模運算算出來每次應該去除掉第幾個元素,直接移除。最終剩下的乙個元素就是答案。

思路三:找規律

這個規律是看了別人的分析發現的。

我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規,實施一點數學策略。

為了討論方便,先把問題稍微改變一下,並不影響原意:

問題描述:n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數。求勝利者的編號。

我們知道第乙個人(編號一定是**(m - 1)% n**-- 不理解的可以自己試一下,反正一定是取餘操作) 出列之後,剩下的n-1個人組成了乙個新的約瑟夫環(以編號為k = (m - 1)%n的人開始):

** k+1 k+2 … n-2, n-1, 0, 1, 2, … k-2, k - 1**

並且從k開始報0。

下面把(k+1 k+2 … n-2, n-1, 0, 1, 2, … k-2, k - 1)轉換為(0~n-2)的形式,即:

k + 1 --> 0

k + 2 --> 1

k + 3 --> 2……

k - 2 --> n-3

k - 1 --> n-2

變換後就完完全全成為了(n-1)個人報數的子問題。

假如我們知道這個子問題(n - 1個人)的解:例如x是最終的勝利者,那麼根據上面這個表把這個x變回去剛好就是n個人情況的解嗎!!

變回去的公式很簡單,相信大家都可以推出來:x』=(x + k + 1)%n

如何知道(n-1)個人報數的問題的解?對,只要知道(n-2)個人的解就行了。(n-2)個人的解呢?當然是先求(n-3)的情況 ---- 這顯然就是乙個倒推問題!好了,思路出來了,下面寫遞推公式:

令f[i]表示i個人玩遊戲報m退出最後勝利者的編號,最後的結果自然是f[n]

遞推公式

f[1]=0;

f[i]=(f[i-1]+ k + 1)%n = (f[i-1]+ (m - 1)%n + 1)%n = (f[i-1]+ m - 1 + 1 + n)%n = (f[i-1]+ m)%n; (i>1)

有了這個公式,我們要做的就是從1-n順序算出f[i]的數值,最後結果是f[n]。

思路一:

public

intlastremaining_solution

(int n,

int m)

count =-1

;}}}

思路二:

public

intlastremaining_solution_v2

(int n,

int m)

int index =0;

while

(students.

size()

>1)

return students.

get(0)

;}

劍指offer 孩子們的遊戲

每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮...

劍指 offer 孩子們的遊戲

每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮...

劍指Offer 孩子們的遊戲

題目描述 每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任...