**提交: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的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮...