說實話,對於演算法這個東西,真的得靠天賦的,不是像專案那樣,你多做多動手自然就會,雖然要靠天賦,但是對於基本的演算法以及基本的演算法面試題我們還是可以通過多積累多思考來培養自己的解題思路。本部落格就是通過講解bat演算法面試中的一些具備代表性的題來教大家如何去慢慢的積累演算法方面的解題思路。
題目描述:給乙個正整數n,列印出所有的和為n的連續正整數序列,如果不存在則輸出空,如:n=15,因為15=1+2+3+4+5=4+5+6=7+8則輸出[1,2,3,4,5],[4,5,6],[7,8]
其實對於演算法基礎比較好的童鞋來說這道題不算難,但是在面試那種環境下,小夥伴們可能因為緊張或者其他原因,在面試現場規定的時間內寫出正確的程式也不是一件很簡單的事,因此我們不妨從一些簡單的例子入手,一點一點的分析,這樣可能解題思路就開啟了。
對於本題,如果在面試時一時想不出來,可以先考慮一種自己平時遇到的簡單的但和此題情況相類似的題目思考一下,如在乙個給定的遞增的陣列中選取兩個數使得其和等於n,存在則輸出這兩個數,不存在則輸出空。對於這道題則太簡單了,我們都知道可以定義兩個指標start與end,剛開始時start指向陣列中的最小的元素(即第乙個元素),end指向陣列中的最大元素(即最後乙個元素),然後判斷start+end的和sum是否為n,如果是則輸出start與end的值,如果sum>n則說明我們應該丟去sum中較大的值end,而選乙個比end小的值,即array[end--],反之如果sum=end為止,如果start>=end還沒找到則說明滿足這種情況的例子不存在,輸出空,注意,可能存在多個滿足條件的例子,找到乙個後然start+1或者end-1,然後繼續找下乙個滿足條件的例子,直至start>=end為止。
參考上面的例子的思路,因為是找連續的正整數序列,因此我們可以這樣先定義乙個start=1,end=2,然後類似滑動視窗的概念,我們通過讓增加start與end的值來動態的調整這個滑動視窗的範圍,直至這個滑動視窗中容納的正整數序列的和為n,具體來說就是當滑動視窗中的和sumn,則說明我們應該縮小這個滑動視窗容納的值,所以應該讓start+1,直至start<=n/2為止,因為至少得容納兩個數才算序列。
基於上述思路,我們可以寫出如下的**:
#include using namespace std;
void printresult(int start,int end)
{ cout<
for(int i=start;i<=end;i++)
cout<
整個**基本上就是上述思路轉化為程式語言之後的結果,**很簡單,所以也沒加啥注釋,雖然很簡單,但是卻能夠考察乙個程式設計師能否將自己的思考過程用程式化的語言表達出來,這也是bat重視演算法面試的原因所在。
程式輸出結果如下:
經典演算法面試題
1 說是有乙個文字檔案,大約有一萬行,每行乙個詞,要求統計出其中最頻繁出現的前十個詞。先用雜湊,統計每個詞出現的次數,然後用在n個數中找出前k大個數的方法找出出現次數最多的前10個詞。2 如題1,但是這次檔案特別大,沒有辦法一次讀入記憶體。1 直接排序,寫檔案時,同時寫入字串及其出現次數。2 可以用...
經典演算法面試題
維護乙個1000個節點的小頂堆。時間複雜度o nlogk 具體步驟 1 將k個陣列的第乙個元素取出來,維護乙個小頂堆。2 彈出堆頂元素存入結果陣列中,並把該元素所在陣列的下乙個元素取出來壓入隊中。3 調整堆的結構,使其滿足小頂堆的定義。4 重複 2 3 直到合併完成。動態規劃 dp n m 表示n被...
C 經典演算法面試題
static intsum int x static void sort int nums console.writeline nums i 字典的定義 必須包含名空間system.collection.generic dictionary裡面的每乙個元素都是乙個鍵值對 由二個元素組成 鍵和值 鍵必...