劍指offer 約瑟夫環

2021-09-19 10:08:44 字數 1397 閱讀 2380

**提交:nowcode

其實是乙個一步步從最後只剩乙個人到還原第一次n個人編號的過程,而不是一步步把每次出局的人找出來,其實過程是未知的

n個小朋友們圍成乙個大圈,編號0…n-1

隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m-1的那個小朋友要出列唱歌,並且不再回到圈中;

從剛出列的下乙個小朋友開始,繼續0…m-1報數…

這樣下去…

直到剩下最後乙個小朋友,求最後乙個小朋友的編號。

舉例看規律n = 8, m = 3

出列剩下

第1輪2

0,1,–,3,4,5,6,7

第2輪5

0,1,–,3,4,–,6,7

第3輪0

–,1,–,3,4,–,6,7

第4輪4

–,1,–,3,–,--,6,7

第5輪1

–,--,–,3,–,--,6,7

第6輪7

–,--,–,3,–,--,6,–

第7輪3

–,--,–,--,–,--,6,–

第8輪6

–,--,–,--,–,--,–,--

每次出列之後,重新編號,每次都會是新號中m-1個人出列。但要還原回原序列中的編號,一步一步向上返:

出列剩下

備註(m=3)

f[1]

第8輪6

, , ,, , ,0,

最後只有乙個人,編號肯定為0

f[2]

第7輪3

, , ,0, , ,1,

在2個人中沒有被淘汰,編號肯定為m%2

f[3]

第6輪7

, , ,0, , ,1,2

2人編號時為1,那這次編號為(1+m)%3

f[4]

第5輪1

,2, ,3, , ,0,1

f[5]

第4輪4

,0, ,1,2, ,3,4

f[6]

第3輪0

2,3, ,4,5, ,0,1

f[7]

第2輪5

5,6, ,0,1,2,3,4

f[8]

第1輪2

0,1,2,3,4,5,6,7

最後肯定是留下乙個人,新編號f[1]是0,但他在上一次的編碼(0,1)中f[2]是多少呢?

f[2] = (f[1] + 3)% 2 = 1

他在上上次的編碼(0, 1,2)中f[3]是多少呢?

f[3] = (f[2] + 3)% 3 = 1

類似的,能夠推出在原序列中的編碼是f[n]

class solution 

return f[n];}

};

劍指offer 約瑟夫環

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

劍指offer 約瑟夫環

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

劍指offer 約瑟夫環

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