題目來源:牛客網
題目一 調整數組序列使奇數位于偶數序列前
描述: 輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位于數組的前半部分,所有的偶數位于位于數組的后半部分,并保證奇數和奇數,偶數和偶數之間的相對位置不變。
解題思路: 代碼
要求:奇數和奇數,偶數和偶數的相對位置不變
- 解法一: 從最后面開始,兩個兩個比較,如果遇到相鄰兩個數左邊的是偶數,右邊的是奇數,則互換位置;否則換下一個; 時間復雜度較高O(n^2);
- 解法二: 在新建兩個數組,分別存放奇數和偶數,一次遍歷后將奇偶分開存入數組,然后在將兩個數組中的數據返回,時間復雜度較低,但是空間復雜度較高;(未給出代碼)
題目二 鏈表中倒數第k個節點
描述:
輸出鏈表中倒數第k個節點;
解題思路: 代碼
- 解法一: 使用棧,該方法會消耗較大資源,不建議使用;
- 解法二: 先復制兩個節點,第一個節點從頭走到k的位置; 然后兩個節點以前執行.next,當第一個節點走到鏈表尾時,第二個節點即走到倒數k的位置;(該解法時間復雜度只有O(n),目前為止最佳解法)
題目三 反轉鏈表
描述:
輸入一個鏈表,反轉鏈表后,輸出鏈表的所有元素。
代碼
題目四 合并兩個排序的鏈表
描述: 輸入兩個單調遞增的鏈表,輸出兩個鏈表合成后的鏈表,當然我們需要合成后的鏈表滿足單調不減規則。
解題思路: 代碼
- 定義一個新的鏈表listnode;
- 判斷list1和list2的val值,那個小就讓listnode的next指向哪個節點;
- 使用遞歸,將list1和list2的值全部遍歷;本題不難,常規的遞歸;
題目五 樹的子結構
描述:
輸入兩顆二叉樹A,B,判斷B是不是A的子結構。
解題思路:代碼
依舊遞歸:使用兩次遞歸;
- 在樹A中找到和B的根節點的值一樣的結點R;第一次遞歸
- 第二步再判斷樹A中以R為根結點的子樹是不是包含和樹B一樣的結構; 第二次遞歸
題目六 二叉樹的鏡像
描述:
操作給定的二叉樹,將其變換為源二叉樹的鏡像。
輸入描述:二叉樹的鏡像定義:
源二叉樹
8
/ \
6 10
/ \ /
5 7 9 11
鏡像二叉樹
8
/
10 6
/ \ / \
11 9 7 5
解題思路: 代碼
千年遞歸:
- 從葉子節點互換;
- 使用遞歸,從下往上開始交換;
題目七 順時針打印矩陣
描述:
輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
解題思路: 代碼
- 找到左上角和右下角元素的坐標,依次順時針打印第一圈;
- 左上角元素加1,右下角元素減1;
- 按照第一步的方法打印第二圈元素;
- 直到左上角元素坐標值大于右下角坐標值;
題目八 包含min函數的棧
描述:
定義棧的數據結構,請在該類型中實現一個能夠得到棧最小元素的min函數;
解題思路: 代碼
- 使用兩個棧,data棧存需要存儲的元素,min棧存小元素;
- push棧的時候,元素存進data棧,如果該元素小于上一個存入的元素,則存入min棧,否則不如min棧;
- pop:如果data棧和min棧pop出的元素不等,則再將min棧pop出的元素push進去;該步是為了防止min元素被pop出;
- top函數為了將min元素移動到棧頂;
- min函數均是得到最小元素,得到pop后在push進去,類似與peek()函數;
題目九 棧的壓入、彈出序列
描述:
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。
解題思路: 代碼
- 按照棧的壓入順序將元素依次壓入棧;
- 入棧過程中同時按照彈出順序出棧,如果棧頂元素等于出棧的順序元素,則,出棧;
- 執行完成后,判斷棧是否為空,如果為空,則表示該序列為棧的彈出序列;
題目十 從上往下打印二叉樹
描述:
從上往下打印出二叉樹的每個節點,同層節點從左至右打印。
解題思路:代碼
該題目即為二叉樹的層序遍歷: 使用隊列解決;
- 將二叉樹的跟節點賦給LinkedList<TreeNode>隊列;
- 在隊列出隊的同時將左右兩子樹分別入隊;
- 隊列出隊完成即得到層序遍歷;
題目十一 二叉搜索樹的后序遍歷序列
描述:
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的后序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
解題思路:代碼
- 二叉搜索數,左子樹的值都小于右子樹的值;
- 后序遍歷,數組最后一個數字為跟節點;
- 得到跟節點后,可以將數組前n-1個數分為左右兩部分,左部分的數值均小于右部分的值;
- 遞歸,3中得到的左右兩部分數值均可以按照2,3步驟重復執行;
- 若遞歸后全部判斷正確,則返回true;
題目十二 二叉樹中和為某一值的路徑
描述:
輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
解題思路:代碼
從頭結點開始,使用遞歸的方法分別向左向右遍歷,看是否存在某條路徑所有的結點值相加等于該target.
查看代碼中控制臺輸出的值則可理解棧的應用.
劍指Offer筆試題(3)
以上代碼全部托管在 Github