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

2021-06-09 05:31:41 字數 587 閱讀 1493

第二十一題

題目:輸入兩個整數n 和m,從數列1,2,3.......n 中隨意取幾個數,

使其和等於m ,要求將其中所有的可能組合列出來.

分析:本題目主要考察的是動態規劃知識點。和最長公共子串行題目比較相似,

遞迴方程為

/ sumk(m-n,n-1)

sumk(m,n)=

\sum(m,n-1)

與最長公共子串行不同的是題目要求輸出所有可能的組合,這就要求遞迴的時候需要儲存當前的狀態彈出操作,就像是馬走日問題一樣。

比較容易想到使用棧進行遍歷的,但是由於使用棧的話對於棧中元素的遍歷不太方便,反而使用list比較方便。

在這裡需要指出的是july給出的答案存在一點點問題,就是當m

**:#include#includeusing namespace std;

void sumk(int sum_m, int n)

else

{ cout<::iterator iter = indexstack.begin();iter!=indexstack.end();++iter)

cout<<*iter<<" ";

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 分析 可以根據空格符將單詞分開,然後針對每個單詞進行操作,...