原创 劍指offer:二叉搜索樹的後序遍歷序列(java)

題目:輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的數組的任意兩個數字都互不相同。     例如輸入數組{5,7,6,9,11,10,8}則返回true,如果輸入的

原创 劍指offer:字符串的排列(java)

題目:輸入一個字符串,打印出該字符串中字符的所有排列。 例如輸入字符串abc,則打印由字符a,b,c所能排列出來的所有字符串:abc,abc,bac,bca,cab,cba   我們求整個字符串的排列,可以看成兩步:首先求出所有可

原创 劍指offer:包含min函數的棧(java)

題目:定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min函數。在該棧中,調用min,push及pop的時間複雜度都是O(1).     看到這個問題,我們的第一反應可能是每次壓入一個新元素進棧時,將棧裏的所有元素排序,

原创 劍指offer:複雜鏈表的複製(java)

題目:請實現函數ComplexListNode複製一個複雜鏈表。在複雜鏈表中,每個結點除了有一個m_pNext指針指向下一個結點外,還有一個m_pSibling指向鏈表中的任意結點或者NULL;    下圖是一個含有5個結點的該類型複

原创 劍指offer:二叉搜索樹與雙向鏈表(java)

題目:輸入一顆二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建新的結點,只能調整樹中結點指針的指向。 比如如下圖中的二叉搜索樹,則輸出轉換之後的排序雙向鏈表爲:     由於要求轉換之後的鏈表是排好序的,我們可以

原创 劍指offer:數組中出現次數超過一半的數字(java)

題目:數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現5次,超過數組長度的一半,因此輸出2.    最直觀的解法是對數組排序,然後我們就

原创 劍指offer:二叉樹的鏡像(java)

題目:請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像 如圖所示:右邊的二叉樹就是左邊的樹的鏡像 上述樹求鏡像的步驟如下:我們先前序遍歷這個樹的每個結點,如果遍歷到的結點有子結點,就交換它的兩個子結點。當交換完所有非葉子結點的左

原创 劍指offer:往上到下打印二叉樹(java)

題目:從上往下打印二叉樹的每個結點,同一層的結點按照從左到右的順序打印。 例如輸入二叉樹:       8    /  \   6    10  /\     /\ 5  7   9  11 則一次打印出8,6,10,5,7,9  

原创 劍指offer:連續子數組的最大和(java)

題目:輸入一個整型數組,數組裏有正數也有負數。數組中一個或連續的多個整數組成一個子數組。求所有子數組的和的最大值。要求時間複雜度爲O(n)       例如輸入的數組爲{1,-2,3,10,-4,7,2,-5},和最大的子數組爲{3,1

原创 劍指offer:樹的子結構(java)

題目:輸入兩棵二叉樹A和B,判斷B是不是A的子結構。 例如圖中所示的兩棵二叉樹,由於A中有一部分子樹的結構和B 是一樣的,因此B是A的子結構。 要查找樹A中是否存在和樹B結構一樣的子樹,思路是第一步:先在樹A中查找與根結點的值一

原创 劍指offer:最小的k個數(java)

題目:輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4 解法一:O(n)的算法,只有當我們可以修改輸入的數組時可用 從上一題中我們可以得到啓發,我們同樣可以基於P

原创 劍指offer:第一個只出現一次的字

題目:在字符串中找出第一個只出現一次的字符。如輸入"abaccdeff",則輸出'b'.     看到這樣的題目,我們最直觀的想法就是從頭開始掃描這個字符串中的字符。當訪問某個字符時拿這個字符和後面的每個字符相比較,如果在後面沒有發現

原创 劍指offer:把數組排成最小的數(java)

題目:輸入一個正整數數組,把數組裏面所有的數字拼接排成一個數,打印能拼接出的所有數字中的一個。例如輸入數組{3,32,321},則打印出這3個數字能排成的最小數字321323.     這個題目最直接的做法應該是先求出這個數組中的所有數

原创 策略設計模式

面向對象的好處,是通過封裝/繼承/多態實現程序的高內聚低耦合,而設計模式可以使得程序更加靈活,容易擴展,並且易於複用. 策略模式是一種定義一系列算法,並將每一個算法封裝起來,而且使他們可以相互替換,此模式讓算法的變化,不會影響到使用算法的

原创 劍指offer:從1到n整數中1出現的次數(java)

題目:輸入一個整數n,求從1到n個整數的十進制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1的數字有1,10,11,和12,1一共出現了5次。 不考慮時間效率的解法,靠它想拿offer有點難     如果在面試的時候碰到這個