微軟等資料結構與演算法面試100題 第十八題

2021-06-09 00:54:24 字數 797 閱讀 8386

第十八題

題目:n 個數字(0,1,…,n-1)形成乙個圓圈,從數字0 開始,

每次從這個圓圈中刪除第m 個數字(第乙個為當前數字本身,第二個為當前數字的下乙個數

字)。當乙個數字刪除後,從被刪除數字的下乙個繼續刪除第m 個數字。

求出在這個圓圈中剩下的最後乙個數字。

分析:這道題有很多解法, 給出了目前最快的演算法。

本題目使用了鍊錶的增刪,直到剩餘乙個節點的時候即為最後輸出的值,設表長度為n,每次刪除第m個元素,則複雜度為mn。

**:#includeusing namespace std;

struct node

;int listcondelete(int length, int k)

nodecurrent->nodenext = nodehead;

nodehead->nodeprevious = nodecurrent;

list = nodehead;

node * tempdele;

while(list!=list->nodenext)

tempdele = list;

list->nodeprevious->nodenext = list->nodenext;

list->nodenext->nodeprevious = list->nodeprevious;

list = list->nodenext;

//coutdelete tempdele;

} return list->value;

}int main()

{ cout<

微軟等資料結構與演算法面試100題 第五題

第五題 查詢最小的k個元素 題目 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。分析 本題目要求計算n個整數的最小的k個,題目沒有直接給出複雜度的要求,因此有很多種解法。比如排序後一次輸出等 很多種解法。如果是要求複雜度為klo...

微軟等資料結構與演算法面試100題 第七題

第七題 微軟亞院之程式設計判斷倆個鍊錶是否相交 給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假設倆個鍊錶均不帶環。問題擴充套件 1.如果鍊錶可能有環列?2.如果需要求出倆個鍊錶相交的第乙個節點列?分析 實現 includeusing namespace std...

微軟等資料結構與演算法面試100題 第十題

第十題 翻轉句子中單詞的順序。題目 輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。例如輸入 i am a student.則輸出 student.a am i 分析 可以根據空格符將單詞分開,然後針對每個單詞進行操作,...