1.重新理解題目
感覺題目對過程的描述不清楚,我們重新來理解題目:2.一行**解決n個人站成一圓圈,編號分別為1、2、…、n,
從編號1的人開始報數1,2,…報到m時,這個報m的人出列;
再從出列人的後一人開始重新報數1,2,…報到m時,再出列;
…求佇列只剩1人時該人的編號。
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 ...