軟體開發筆試心得一 迴圈報數,圓圈報數,約瑟夫問題

2021-06-12 00:49:56 字數 1386 閱讀 5604

最近一段時間一直在找工作,沒有心思寫心得。今天剛好從淳中視訊面試回來,有一道題很有意思。

1. n個人圍成乙個圓圈,從1到3開始報數,報到3的人出去,這樣一直迴圈,直到只剩下乙個人。問剩下的人在開始報數之前的編號?

當時我想的是直接用迴圈鍊錶來模擬整個報數的過程,即構造乙個n個數的迴圈鍊錶,進行迴圈遍歷,每當數到3時刪除當前指向的節點,直到剩下最後乙個。

但是該演算法比較複雜,肯定還有簡單的演算法。

據說著名猶太歷史學家 josephus有過以下的故事:在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從,josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

我們回到解題思路上,考慮一般的情況,n個人排成一圈,從第1個人開始報數,報數口號從1到m(報到m的人從圓圈裡出去),迴圈直到只剩乙個人,問最後剩下的人開始的編號是多少?

假設答案ans = f(n,m)。則f(1,m)=1; f(2,2) = 1; f(2,3) = 2;

假設有n個數: 1,2,3,4,5,6....,n-2,n-1,n。

中獎的第乙個人的序號一定是:a1 =  (m%n ).那麼剩下的人構成乙個n-1約瑟夫環:

1,2,3...a1-1,a1+1...n-1,n.

即: a1+1,a1+2....1,2,...a1-1. 每個元素做對映:

a1+1 -> 1,

a1+2 -> 2,

a1-1 -> n-1.

剩下的數構成乙個新的約瑟夫環並且規模為n-1.

因為從n轉換到n-1的時候,每個元素都進行了減少a1的迴圈對映,而且a1 =m%n

所以有遞推公式:f(n,m) =  ( f(n-1,m) +  (m%n) -1 )%n + 1.

且f(1,m)=1;

考慮更一般的情況:起始報數從第k個人開始:

則先將每個元素進行減少k-1的迴圈對映:

k -> 1

k+1 -> 2

k-1 -> n

則f(n,m,k) = (f(n,m) + k-1 -1) % n +1.

有了這些公式後就可以程式設計實現啦:

輸入三個數,總數n,報數口號m,從第k個人開始報數。

輸出是最後剩下的人開始的編號(注: 編號從1開始,報數從1開始)

int func(int n,int m,int k)

ans = (ans + k-1 -1)%n + 1;

return ans;

}

時間複雜度是o(n).

全志 軟體開發筆試

violate 關鍵字及其作用場景 volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取資料。如果沒有volatile關鍵字,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將...

京東軟體開發筆試記錄

1,求出最長公共子串行,並判斷是否可以進行火星。記不清了 include include using namespace std int main for int i 0 i n i for int i 0 i n i for int i 1 i n i int max length dp n n ...

北京華宇軟體開發筆試題

1.滿二叉樹的節點數公式為2 x 1 2.已知二叉樹的中序和後序求前序 例子,後序遍歷為 gbdehfca,中序遍歷為 dgbaechf 後序遍歷中的最後乙個元素是根節點,a,然後查詢中序中a的位置 把中序遍歷分成 dgb a echf,而因為節點個數要對應 後序遍歷分為 gbd ehfc a,gb...