題目描述:輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的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...