面試題62 圓圈中最後剩下的數字

2021-10-05 23:54:37 字數 1871 閱讀 8797

1.重新理解題目

感覺題目對過程的描述不清楚,我們重新來理解題目:

n個人站成一圓圈,編號分別為1、2、…、n,

從編號1的人開始報數1,2,…報到m時,這個報m的人出列;

再從出列人的後一人開始重新報數1,2,…報到m時,再出列;

…求佇列只剩1人時該人的編號。

2.一行**解決

class solution 

};

3.合理解釋

[ 按照邏輯 ]

第乙個編號為1,遞推式為:

f(1)=1;

f(n)=(f(n-1)+m)%n

[ 按照邏輯 理解遞推式:f(n)=(f(n-1)+m)%n,f(1)=1 ]

我們以乙個例子來推廣結論,注意下文都以m=3,n=5為前提!!!

語義:f(4)=1,就意味著有4(n=4)個人進行該活動(m=3),最後佇列只剩下一人時,其編號為1。

我們考慮能否在已知f(4)=1(當然你可以自己去驗證)的情況下推算出f(5)的值呢?可以。

因為5個人進行該活動時,第一步就會去掉編號3的人,剩下四個人從編號4重新開始報數1,2,…

也就是說,報數從[1,2,3,4,5]變成[3,4,x,1,2],

此時,原題就變成:剩下四個已報數的人繼續進行該活動。

如果把這次報數號[3,4,x,1,2]當成新編號的話,

那麼由於f(4)=1是已知的,不用繼續進行活動,就已經知道,

最後佇列剩下的乙個人一定就是新編號為1的那個人(一定記得f(4)=1已知啊啊啊!!!),

他對應最開始5人佇列[1,2,3,4,5]中的編號4,於是只出列了乙個人,就能根據f(4)=1推出f(5)=4。

所以關鍵問題是如何將 [3,4,x,1,2]中的1(f(4)的值) 對映到 [1,2,3,4,5]中的4(f(5)的值)?

我們觀察發現,不只有我們需要的1可以對映到4,

[3,4,x,1,2]中的每個位置的值都可以通過同一關係 f 對映到[1,2,3,4,5]中的對應位置,

不信你看:

( [3] +3)%5= [1],

( [4] +3)%5= [2],

[x] 。。。 ,已出列,不管它,

( [1] +3)%5= [4],(雖然只有這個是我們要的答案),

( [2] +3)%5= [5],

即對於[3,4,x,1,2]中的任乙個數p和[1,2,3,4,5]中對應位置的q,都有( [p] +3)%5= [q],

那當然有( [1] +3)%5= [4],

也就是( [f(4)] +3)%5= [f(5)],

也就是( [f(n-1)] +m)%n= [f(n)]。

就是說我們若知道f(n-1)的值,就能立即推出f(n)的值,也就是說

只要知道了f(1)的值,f(2),f(3),…,f(n)的值就都知道了。

那麼f(1)的值是多少呢?

根據語義,佇列只有乙個人進行該活動,那麼剩下的就只有他自己了,就是f(1)=1。

[ 但是本題 ]

第乙個編號為0(坑。。。),則遞推式變為

f(1)=0;

f(n)=(f(n-1)+m)%n;

[ 最終答案 ]

在引數中加上m不影響等式成立,方便遞迴

f(1,m)=0;

f(n,m)=(f(n-1,m)+m)%n;

題解思路來自下面:

面試題62 圓圈中最後剩下的數字

面試題62 0,1,n 1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。例如,0 1 2 3 4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2 0 4 1,因此最後剩下的數字是3。示例 1 輸入 n 5,m...

面試題62 圓圈中最後剩下的數字

1.題目描述 0,1,n 1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。例如,0 1 2 3 4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2 0 4 1,因此最後剩下的數字是3。示例 示例 1 輸入 n...

面試題62 圓圈中最後剩下的數字

題目 0,1,n 1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。例如,0 1 2 3 4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2 0 4 1,因此最後剩下的數字是3。示例 1 輸入 n 5,m 3 ...