每天一道劍指offer 約瑟夫環求解圓圈中剩餘的數

2021-09-12 23:27:22 字數 837 閱讀 9312

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

問題大意:n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人 繼續從0開始報數。求勝利者的編號。這是乙個約瑟夫問題。

約瑟夫問題可以用乙個遞推公式來解決:

f(n,m)=(f(n−1,m)+m)%n

f(n,m)=(f(n−1,m)+m)%n

f(n,m)f(n,m)表示,n個人報數,每報到m時殺掉那個人,最終勝利者的編號

f(n−1,m)f(n−1,m)表示,n-1個人報數,每報到m時殺掉那個人,最終勝利者的編號

每退出乙個人,下乙個人成為頭,相當於把陣列向前移動m位。若已知n-1個人時,勝利者的下標位置位f(n−1,m),則n個人的時候,就是往後移動m為,(因為有可能陣列越界,超過的部分會被接到頭上,所以還要模n),既f(n,m)=(f(n−1,m)+m)%n。

public int lastremaining_solution(int n, int m) 

if(n==1)

return (lastremaining_solution(n-1,m)+m)%n;

}

每天一道劍指Offer 30

date 2020 7 18 連續子陣列的 最大和 注意 子陣列的起點不一定是0 hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個...

每天一道劍指offer 翻轉單詞順序列

牛客最近來了乙個新員工fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事cat對fish寫的內容頗感興趣,有一天他向fish借來翻看,但卻讀不懂它的意思。例如,student.a am i 後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是 i am a student....

每天一道劍指offer 求1 2 3 n

考試結束,班級平均分只拿到了年級第二,班主任於是問道 大家都知道世界第一高峰珠穆朗瑪峰,有人知道世界第二高峰是什麼嗎?正當班主任要繼續發話,只聽到角落默默響起來乙個聲音 喬戈里峰 每天一道劍指offer 求1 2 3 n 求1 2 3 n,要求不能使用乘除法 for while if else sw...