劍指offer筆試題26 30

2021-09-13 16:03:28 字數 3048 閱讀 3789

題目描述:輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

正確的思路:首先對每個結點進行複製,並插入到原有結點的後面。第二步再逐個將新結點的特殊指標指向原有結點特殊指標所指位置的下乙個位置。第三步將兩個鍊錶拆分。

/*

struct randomlistnode

};*/

class solution

void copy(randomlistnode* phead)

}void handle(randomlistnode* phead)

}randomlistnode* split(randomlistnode* phead)

return clonehead;

}};

錯誤的思路:一開始我將後兩步合併在一起執行,後來發現「當某個結點的特殊指標指向前面的結點時,鍊錶前面部分已經被拆開,這樣就無法找到正確的特殊指標了」。

題目描述:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

思路:

(1) 將二叉樹拆分為左子樹,根節點,右子樹;

(2) 先將左子樹排序後,並返回乙個最大的結點;

(3) 將根節點與前面返回的結點建立雙向連線;

(4) 對右子樹進行排序,(其中最大結點變為根結點)。

(5) 遍歷雙向鍊錶找到頭節點

class solution 

void convertnode(treenode* pnode,treenode** lastnode)

};

題目描述:輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

思路:先假設字串長度為 n,且不存在重複元素 ,很明顯就是乙個全排列的問題,結果為(ann),這裡我們就用全排列的思想,從前往後看字串的每一位都會有幾種不同情況。

(1) str[0] 可以放置所有的(n個)字元,那麼將str[0]與它本身還有後面所有字元交換位置,此時首位已經確定,可用字元個數減為(n-1);

(2) str[1] 可以放置剩下的(n-1)個字元,那麼將str[1]與它本身還有後面所有字元交換位置,此時次首位已經確定,可用字元個數減為(n-2);

(3) …

(4) str[n-1] 就是最後乙個位置,此時可以放置的也只剩下乙個字元,不用再交換了,直接跳出迴圈

(5) 以上的分析全是基於無重複元素,只需要再交換位置進行一下比較,如果是相同字元,那麼就直接跳過這個位置,同時可用字元數減一。

class solution 

void helper(vector&res,string str,int index)

。由於數字2在陣列**現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

思路:首先我們要知道這種陣列的乙個 特性:假如存在某一元素temp出現的次數超過長度的一半,那麼我們從陣列中去掉兩個相異的數字,temp出現的次數還是大於剩下陣列長度的一半。基於這個事實,我們每次比較兩個元素:

(1) 首先選定numbers[0]為基準元素temp,此時temp出現次數count為1

(2) 如果numbers[1]與temp相同,計數count加一

(3) 如果numbers[1]與temp不同,計數count減一

(4) 在此過程中肯定會遇到 計數為零的情況, 計數為零說明前面的元素為成對相異,因此我們直接選定剩下子陣列的首元素為新的基準temp,這並不會破壞該陣列的特性。

class solution

};

題目描述:輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

思路1:這是乙個topk的問題,首先想到堆排序,先對前k個資料進行構造大根堆,然後將剩下的元素逐個與根節點比較,小於根節點時將其與根節點交換並下濾。時間複雜度為nlogk。

class solution 

//剩餘的元素逐個與根節點進行比較

//如果大於等於根節點,跳過

//如果小於根節點,替換根節點進行下濾

for(int i=k; iinput[i])

}//比較結束後,再對k個元素的大根堆進行刪除操作

//刪除並不用真正的刪除操作,只需要將最大的根節點和最後乙個元素交換位置,

//再令陣列大小減一,並對新的根節點進行下濾

for(int j=k-1; j>0 ; --j)

for(int i=0; i&arr,int i,int n)

//使用插入排序對整個vector排序

for(int cur=1;cur0 && tmpresult(input.begin(),input.begin()+k);

return result;

}};

思路三:採用紅黑樹mutiset。

class solution 

inset leastnumbers;

auto iter = input.begin();

for( ; iter!=input.end(); ++iter)}}

//此時的leastnumbers為:4,3,2,1為什麼可以執行成功呢`

for(auto &i:leastnumbers)

result.push_back(i);

return result;

}};

繼續劍指offer,26 30

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 題目分析 這套題非常難,這個方法我自己估計是想不出,所以就把之前的拷貝過來,這套...

劍指offer 26 30記錄

輸入兩棵二叉樹a和b,判斷b是不是a的子結構。約定空樹不是任意乙個樹的子結構 b是a的子結構,即 a中有出現和b相同的結構和節點值。例如 給定的樹 a 3 4 5 1 2 給定的樹 b 4 1返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。示例 1 輸入 a 1,2,3 b 3,...

劍指Offer 滴滴筆試題 知識點總結

劍指offer 滴滴筆試題 知識點總結 情景回顧 地點 山東省網路環境智慧型計算技術重點實驗室 事件 滴滴筆試 總體來說,滴滴筆試內容體量不算多,主要分為19道選擇題 1道多選題,2道程式設計題 1道簡答題 也不簡單 選擇題 考查知識點 二叉樹某層中節點個數 2i 1 費波納茨數列應用 上9級台階的...