微軟面試100題 41 50

2022-07-29 23:03:32 字數 1995 閱讀 1712

第四十三題:二叉樹的非遞迴前中後序遍歷

前序遍歷:

void preordershowtreeiterative(bstreenode *proot)

}

中序遍歷:

void inordershowtreeiterative(bstreenode *proot)else

}}

後序遍歷:

void postordershowtreeiterative(bstreenode *proot)

while(!visit.empty())

}

第四十四題:找出重複次數最多的十條簡訊

1千萬=10m 每條資訊140char=b,總共1400mb,可以放進記憶體。可以用hash table計算每條資訊出現的次數,然後用min heap sort來找出最多的十條。 

第四十七題:求陣列的最長遞減子串行(非連續子串行)

思路:使用動態規劃dp,儲存搜尋到目前為止的最長遞減子串行。搜尋到新的遞減子串行時,先把之前的best序列中比新序列頭元素要大的元素放到新序列的前面,再開始放入新序列的開頭元素。如果新的序列的長度比best的長度要大,則更新。複雜度為o(n^2)

int longestdecreasesequence(int *a,int

cnt)

if(i==cnt-1)break;//

最後也必須複製一遍

nlen=0

;

for(int j=0;j//

搜尋best裡面比當前新下降序列的頭元素要大的元素

if(bestseq[j]>a[i]) nowseq[nlen++]=bestseq[j];//

放在now的前面

else

break

; }

nowseq[nlen++]=a[i];//

最後才放入最新的元素

} }

for(int i=0;i"";

cout

blen;

}

網上普遍的dp方法

:用乙個陣列記錄第k個遞減序列的長度和最小值。遍歷到乙個新元素時,搜尋此元素能否加到各個遞減序列中。最壞情況下複雜度為o(n^2),但使用

二分查詢

可以把複雜度降為o(nlogn),(研究了以後發現這個演算法太蛋疼就沒搞了)

int tradition(int *a,int cnt)//

為了保證最後len[i]是最長的長度,只有len[j]不小於len[i]時才更新,確保len[i]不斷年遞增

if(len[i]>maxlen) maxlen=len[i];

}return

maxlen;

}

第四十七題:二分查詢

int binarysearchrecur(const

int *a,const

int &begin,const

int &end,const

int &t,int ascend=1)

else}

int binarysearch(const

int *a,const

int &begin,const

int &end,const

int &t,int ascend=1

)

return

b;}

第四十八題:二分查詢左移遞減數列

思路:乙個左移的遞減序列從中點分割成兩份後,一定是乙份是純遞減數列,一列也是左移遞減數列。

判斷哪邊是純遞減是看中間元素是否小於頭元素。  如果要找的目標在純遞減則使用二分,否則遞迴自身。

int shiftedbinarysearch(int *a,int begin,int end,int

t)

return

b;}

微軟面試100題

41.求固晶機的晶元查詢程式 晶元盤由數目不詳的大小一樣的晶元組成,晶元並不一定全布滿晶元盤,照相機每次這能匹配乙個晶元,如匹配過,則拾取該晶元,若匹配不過,照相機則按測好的晶元間距移到下乙個位置。求遍歷晶元盤的演算法 求思路。兩個非降序鍊錶的並集,1 2 3 和 2 3 5 並為 1 2 3 5 ...

微軟面試100題 64

64.尋找醜數 運算 題目 我們把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第1500個醜數。分析 這是一道在網路上廣為流傳的面試題,據說google曾經採用過這道題。package...

微軟面試100題 9

題目 輸入乙個整數陣列,判斷該陣列是不是某二元查詢樹的後序遍歷的結果。如果是返回true,否則返回false。例如輸入5 7 6 9 11 10 8,由於這一整數序列是如下樹的後序遍歷結果 8 6 10 5 7 9 11 因此返回true。如果輸入7 4 6 5,沒有哪棵樹的後序遍歷的結果是這個序列...