第四十三題:二叉樹的非遞迴前中後序遍歷
前序遍歷:
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,intcnt)
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(constint *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,intt)
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,沒有哪棵樹的後序遍歷的結果是這個序列...