繼續劍指offer,26 30

2021-10-01 16:35:28 字數 3371 閱讀 2735

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

題目分析:這套題非常難,這個方法我自己估計是想不出,所以就把之前的拷貝過來,這套方法的最巧妙的地方就是random指標的拷貝,利用了鍊錶的性質,即將每個隨機指向轉換為其下乙個,然後斷開連線即可

/*

struct randomlistnode

};*/

class

solution

p = phead;

while

(p !=

nullptr

) p = phead;

newhead = p-

>next;

randomlistnode *p2 = p-

>next;

while

(p!=

nullptr)}

return newhead;}}

;

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

題目分析:二叉搜尋樹的中序遍歷就是乙個典型的排序陣列,因此這道題將二叉樹的中序遍歷出後輸入鍊錶即可。但是題目有要求不能建立新的節點,只能調整樹中節點的指標。

/*

struct treenode

};*/

class

solution

p = temp.

top();

temp.

pop();

if(flag ==0)

else

p = p-

>right;

}return newroot;}}

;

題目描述:陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列**現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

題目分析:這道題如果不限制的條件的話非常簡單,只用簡單的計數即可。這樣的話時間複雜度n,空間複雜度也不高,但是這樣的回答如果去面試是百分之百不會過的,因為這不是這道題的奇淫巧技。

//簡單計數每個位的資料個數,又快又好用

class

solution

}return0;

}};

面試官肯定喜歡這樣的方法,顯得有腦子。在遍歷陣列時儲存兩個值:一是陣列中乙個數字,一是次數。遍歷下乙個數字時,若它與之前儲存的數字相同,則次數加1,否則次數減1;若次數為0,則儲存下乙個數字,並將次數置為1。遍歷結束後,所儲存的數字即為所求。然後再判斷它是否符合條件即可。

//很繁瑣的方法  我很不喜歡,但是就是面試喜歡出

class

solution

if(number>numbers.

size()

/2)return

true

;return

false;}

intmorethanhalfnum_solution

(vector<

int> numbers)

if(count <=

0&& i == num -1)

else}if

(numbers[i]

== nowzhi)

if(numbers[i]

!= nowzhi)}if

(count >0)

return0;

}};

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

題目分析:這道題最小的時間複雜度也是n,空間複雜度為k,總的來說就是用乙個滑動視窗找就行了。

如果使用排序演算法的話也是很簡單的,但是時間複雜度略高,空間複雜度較低。

//這種傻瓜方法是能通過的,時間複雜度nlogn

class

solution

return output;}}

;

//這種更聰明的方法反而過不去,時間複雜度為n,我對那個傻瓜編譯器服了

class

solution}}

static

bool

cmp(

int a,

int b)

vector<

int>

getleastnumbers_solution

(vector<

int> input,

int k)

sort

(minarr.

begin()

, minarr.

end(

), cmp)

;for

(int i = k; i < input.

size()

; i++)}

return minarr;}}

;

題目描述:hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)

題目分析:這個題的話用兩個滑動指標遍歷整個情況是很簡單的,時間複雜度是n,空間複雜度為1。

class

solution

if(array.

size()

==1)int low, high;

int temp=0;

int maxoutput=array[0]

;for

(int low =

0; low < array.

size()

; low++)if

(maxoutput < temp)

temp =0;

}}return maxoutput;}}

;

但是面試官是不會喜歡這種做法的,因為這種做法很傻很天真,他們會覺得沒有技術含量,因此你必須採用動態規劃的方法顯得你能力很強。最核心的就是一句話

dp[i] = max

public

intfindgreatestsumofsubarray

(int

array)

return res;

}

劍指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筆試題26 30

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 正確的思路 首先對每個結點進行複製,並插入到原有結點的後面。第二步再逐個將新結點...

劍指offer全套解答 劍指offer 1 5

1.二維陣列中的查詢 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。public class solution int n array 0 length i...