誰是老大 一道類似Joseph環的智力題

2021-06-29 10:07:14 字數 1328 閱讀 3856

這是乙個在面試中被問到的問題,其實細想起來很簡單。但當時只給了兩分鐘,沒能直接給出解決方案。

有156個海盜在乙個島上,他們決定選乙個人出來做老大,由於人這麼多,選誰當老大一直沒有選好,於是他們想出來乙個辦法,把這156個人從1到156編號,然後按1, 2, 1, 2, …報數,報到1的退出選舉,剩下來的人繼續重新報數,然後把『1』的人踢出局,最後剩下來的就是老大。那麼請問,誰是老大?

這個問題有點像經典的joseph環,但其實要比joseph環容易。由於每次是報『1』的人出局,所以我們可以用x % 2 == 0來作為判斷條件。於是程式可以寫成下面這樣:

(python)

def

calc_out_2

(num):

nlist = range(1, num)

cnt = 1

while len(nlist) != 1:

nlist = [x / 2

for x in nlist if x % 2 == 0]

cnt *= 2

return cnt

calc_out_2(156)

裝b一下,用一下函式式程式設計,可以寫成這樣:

def

calc_out_3

(num):

nlist = range(1, num)

cnt = 1

while len(nlist) != 1:

nlist = map(lambda x:x/2, filter(lambda x:x%2 == 0, nlist))

cnt *= 2

return cnt

calc_out_1(156)

再仔細的分析一下,由於每次都是『1』出局,所以定義f(n)為n個海盜選老大的函式。

f(2) = 2

f(3) = 2

f(4) = 4

f(5) = 4

f(6) = 4

f(7) = 4

f(8) = 8

f(9) = 8

看出來規律了吧:

f(n) = max(2^x) if 2^x < n

重寫python**如下:

import math as m

log = m.log

defcalc_out_1

(num):

return pow(2, int(log(num)/log(2)))

calc_out_1(156)

一道Joseph環問題

在學校寒假搞的演算法天梯中遇到的乙個joseph環的問題,題目如下。題目的情景是乙個雙向的 joseph 環,n 個人看作 n 個結點,兩個老師分別沿兩個方向移動,把每兩個節點之間用雙向箭頭連線,圖大概長下面這個樣子。這啟發我們可以構建乙個雙向鍊錶來模擬這個遊戲過程,人出列就等價於節點刪除,老師清點...

每日一道演算法題 約瑟夫環 c 實現

問題描述 n個人坐成乙個圓環 編號為1 n 從第1個人開始報數,數到k的人出列,後面的人重新從1開始報數。問最後剩下的人的編號。例如 n 3,k 2。2號先出列,然後是1號,最後剩下的是3號。最直接的方法是暴力列舉法,第一乙個標誌陣列label n 初始化為0,當label i 等於1時表示對應編號...

一道不錯的演算法題 判斷鍊錶是否有環

這是之前朋友出的一道題目,感覺不錯,就拿來分享一下。問題如下 乙個單向鍊錶,怎麼判斷他是否存在環?圖示 對於最簡單的做法就是 用乙個指標走一圈,如果重複遇到其他任何乙個指標,則證明有環。但是這樣做的問題就是 單指標需要留下腳印,會弄髒鍊錶資料,而如果不能髒資料的話,就需要增加乙個容器,並且增加查詢的...